使用一系列 (row,col) 索引获取 data.table 切片

Taking a data.table slice with a sequence of (row,col) indices

我有一个类似于下面的 data.table

tab <- data.table(a = c(NA, 42190, NA), b = c(42190, 42190, NA), c = c(40570, 42190, NA))
tab
       a     b     c
1:    NA 42190 40570
2: 42190 42190 42190
3:    NA    NA    NA

根据指定的行索引向量和列索引向量,我想要一个向量 returned 包含 tab 中对应于指定行索引向量的点和列索引。

例如,假设我想获取tab中的对角线元素。我会指定两个向量,

ri <- 1:3
ci <- 1:3

和某些函数 function(ri, ci, tab) 会 return tab 的对角线元素。

如果tabdata.frame,我会做下面的事情,

as.data.frame(tab)[cbind(ri, ci)]

但是,我想避免使用 data.frame 语法。我还想避免 for 循环,因为这往往很慢。

(更新:@42- 使用 [.data.frame 的答案是最好的。但这是我之前的答案)

as.matrix(tab)[cbind(ri, ci)]

将比 melt 更快、更节省内存。

我认为您没有理由不按照@thelatemail 的建议将 DT 声明为矩阵。这是DT语法不如matrix强大的一种情况。

(对于大型 DT 的内存效率,data.table 有命令 setDF/setDT 允许转换 to/from DF/DT 而无需复制,但我我不知道它有矩阵的等价物。如果这是人们经常做的事情,它可能会很好地增强 DT 的要求。

对于非常大的维度,您可以查看 Matrix's sparse-matrix formats 包),或者分块数据,或者使用磁盘支持的数据结构。)

有一种比强制转换为矩阵或 data.frame 更快的方法。只需使用 [data.frame 函数即可。

`[.data.frame`( tab,  cbind(ri,ci) )
[1]    NA 42190    NA

这是 [.data.frame 函数的函数语法。