我的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
的对角元素。
如果tab
是data.frame
,我会在下面做什么,
as.data.frame(tab)[cbind(ri, ci)]
但是,我想避免使用data.frame
语法。我还想避免for
循环,因为这往往很慢。
答案 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
函数的功能语法。