R 基于不同表操作一个表中的数据

R 基于不同表操作一个表中的数据,r,data.table,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, funct

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

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

看起来您是按行排序的,因此我不认为
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

非常好,速度非常快,我不需要把一张表复制到另一张表中。你们知道为什么若我把矩阵换成data.frame,速度不会这么快吗?我是SAS用户,处理数据对我来说是一个巨大的挑战。有关于R中更高级的数据处理任务的好书吗?
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