我尝试根据第二个表的内容操作一个表的列。我写了以下代码:
mat1 = matrix(rnorm(10000*100), ncol=100)
pom1 = mat1
mat2 = matrix(sample(1:100, 10000*100, replace=T), ncol=100)
mat1 = cbind(mat1, mat2[,1:100])
for(i in 101:200){
pom1[,i-100] = apply(mat1[,1:200], 1, function(x) x[which(seq(1:100)==x[i])])
}
我不想将mat2包含在mat1中,而且代码相当慢。是否可以使用data.table
或其他方式加速此代码,而不是将mat2包含在mat1中?
在mat2中,我有一个整数,它显示mat1中哪个元素要传递给pom1。例如,如果mat2[2,5] = 8
,那么我想加入pom1[2,5] = mat1[2,8]
。
例如
mat1
V1 V2 V3 V4 V5
0.1 0.2 0.3 0.4 0.5
0.5 0.4 0.3 0.2 0.1
mat2
V1 V2 V3 V4 V5
1 3 2 4 4
2 5 3 2 5
然后在pom1我期待
V1 V2 V3 V4 V5
0.1 0.3 0.2 0.4 0.4
0.4 0.1 0.3 0.4 0.1
答案 0 :(得分:0)
好像你是按行排序,因此我认为data.table
不适合这里。使用矩阵(而非data.frame
s)的事实使得apply
系列即使在大数据集上也非常有效
这似乎有用
pom1 <- t(sapply(seq_len(nrow(mat1)), function(x) mat1[x, mat2[x, ]]))
pom1
# V1 V3 V2 V4 V4
# [1,] 0.1 0.3 0.2 0.4 0.4
# [2,] 0.4 0.1 0.3 0.4 0.1
我已经在你的1MM数据集上进行了测试,平均运行时间不到1/10秒,所以它应该足够快我猜
mat1 = matrix(rnorm(10000*100), ncol=100)
mat2 = matrix(sample(1:100, 10000*100, replace=T), ncol=100)
library(microbenchmark)
microbenchmark(test = t(sapply(seq_len(nrow(mat1)), function(x) mat1[x, mat2[x, ]])))
# Unit: milliseconds
# expr min lq mean median uq max neval
# test 61.62792 69.59457 77.88516 72.18077 76.10537 141.2513 100