使用一系列 (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
的对角线元素。
如果tab
是data.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
函数的函数语法。
我有一个类似于下面的 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
的对角线元素。
如果tab
是data.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
函数的函数语法。