采用带有(row,col)索引序列的data.table切片

时间:2018-06-01 01:57:41

标签: r indexing data.table matrix-indexing

我的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

在指定行索引的向量和列索引的向量时,我希望返回一个包含tab中与行索引和列索引的指定向量对应的点的向量。

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

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

并且某些函数function(ri, ci, tab)将返回tab的对角元素。

如果tabdata.frame,我会在下面做什么,

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

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

2 个答案:

答案 0 :(得分:4)

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

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

melt更快,内存效率更高。

我认为没有理由不将你的DT声明为矩阵,正如@thelatemail建议的那样。这是DT语法不如矩阵那么强大的一种情况。

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

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

答案 1 :(得分:4)

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

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

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