2012-07-17 36 views
6

Tôi có các bảng dự phòng có kích thước khác nhau. Tôi muốn lập chỉ mục cho họ bằng cách sử dụng một tập hợp các giá trị từ tập dữ liệu. Tuy nhiên, myTable[c(5,5,5,5)] rõ ràng không làm những gì tôi muốn. Làm cách nào để nhận được c(5,5,5,5) để đọc là myTable[5,5,5,5]?Lập chỉ mục bảng đa chiều sử dụng vector cột

Trả lời

3

Theo dõi trên câu trả lời của @ ttmaccer: điều này hoạt động vì đoạn (tối thiểu) mơ hồ trong số ?"[" có nội dung:

When indexing arrays by ‘[’ a single argument ‘i’ can be a 
matrix with as many columns as there are dimensions of ‘x’; 
the result is then a vector with elements corresponding to 
the sets of indices in each row of ‘i’. 

Hiệu quả của việc sử dụng t(ii) trong

ii <- c(5,5,5,5) 
a[t(ii)] 

là để chuyển đổi ii để một ma trận 1x4 rằng [ giải thích như một ma trận như mô tả ở trên; a[matrix(ii,nrow=1)] sẽ rõ ràng hơn nhưng ít gọn hơn.

Những điều tốt đẹp về phương pháp này (bên cạnh tránh những khía cạnh huyền diệu-dường như của do.call) là nó hoạt động song song trong hơn một bộ chỉ số, như trong

jj <- matrix(c(5,5,5,5, 
       6,6,6,6),byrow=TRUE,nrow=2) 
a[jj] 
## [1] 4445 5556 
+0

Cảm ơn để mở rộng trên @ câu trả lời ttmacer của . Rất đẹp. –

2

Nếu tôi đúng hiểu câu hỏi của bạn, cấu trúc này, sử dụng do.call(), nên làm những gì bạn muốn:

## Create an example array and a variable containing the desired index 
a <- array(1:1e4, dim = c(10, 10, 10, 10)) 
ii <- c(5, 5, 5, 5) 

## Use do.call to extract the desired element. 
do.call("[", c(list(a), ii)) 
# [1] 4445 

Cuộc gọi trên hoạt động vì đây là tất cả tương đương:

a[5, 5, 5, 5] 
`[`(a, 5, 5, 5, 5) 
do.call("[", list(a, 5, 5, 5, 5)) 
do.call("[", c(list(a), ii)) 
Các vấn đề liên quan