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