根据不同的表操作一个表中的数据

时间:2014-10-23 20:35:30

标签: r data.table

我尝试根据第二个表的内容操作一个表的列。我写了以下代码:

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

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