R 加速跨列计算

R 加速跨列计算,r,for-loop,time,R,For Loop,Time,我有几个中等大小的数据帧,需要跨数据中的不同列进行计算;例如,我想比较一个数据帧中的列I和另一个数据帧中的列I-1。我目前使用for循环。计算涉及到每对值的元素级比较,因此有点慢:例如,我将每列数据转换成矩阵,并与自身的转置进行比较(还有一些额外的复杂情况)。在我的应用程序中(其中数据有大约100列和3000行),这目前需要大约95秒。我正在寻找提高效率的方法。如果我比较每个数据帧的同一列,我会尝试使用mapply,但是因为我需要在不同的列之间进行比较,所以我不知道这是如何工作的。当前代码如下所

我有几个中等大小的数据帧,需要跨数据中的不同列进行计算;例如,我想比较一个数据帧中的列I和另一个数据帧中的列I-1。我目前使用for循环。计算涉及到每对值的元素级比较,因此有点慢:例如,我将每列数据转换成矩阵,并与自身的转置进行比较(还有一些额外的复杂情况)。在我的应用程序中(其中数据有大约100列和3000行),这目前需要大约95秒。我正在寻找提高效率的方法。如果我比较每个数据帧的同一列,我会尝试使用
mapply
,但是因为我需要在不同的列之间进行比较,所以我不知道这是如何工作的。当前代码如下所示:

d1 <- as.data.frame(matrix(rnorm(100000), nrow=1000))
d2 <- as.data.frame(matrix(rnorm(100000), nrow=1000))

r <- list()
ptm2 <- proc.time()
for(i in 2:100){
  t <- matrix(0 + d1[,i] > 0,1000,1000)
  u <- matrix(d1[,i],1000,1000)*t(matrix(d2[,i-1],1000,1000))
  r[[i]] <- t * u
}
proc.time() - ptm2

d1根据您的示例,如果您根据要比较的列提前对齐d1和d2矩阵,那么下面是如何使用
mapply
。它似乎只是稍微快一点,所以并行计算将是获得速度增益的更好方法

d1 <- as.data.frame(matrix(rnorm(100000), nrow=1000))
d2 <- as.data.frame(matrix(rnorm(100000), nrow=1000))

r <- list()
ptm2 <- proc.time()
for(i in 2:100){
  t <- matrix(0 + d1[,i] > 0,1000,1000)
  u <- matrix(d1[,i],1000,1000)*t(matrix(d2[,i-1],1000,1000))
  r[[i]] <- t * u
}
proc.time() - ptm2
#user  system elapsed 
#0.90    0.87    1.79 
#select last 99 columns of d1 and first 99 columns of d2 based on your calcs
d1_99 <- as.data.frame(d1[,2:100]) #have to convert to data.frame for mapply to loop across columns; a data.frame is simply a list of vectors of equal length
d2_99 <- as.data.frame(d2[,1:99])
ptm3 <- proc.time()
r_test <- mapply(function(x, y) {
  t <- matrix(x > 0, 1000, 1000) #didn't understand why you were adding 0 in your example
  u <- matrix(x,1000,1000)*t(matrix(y,1000,1000))
  t * u
}, x=d1_99, y=d2_99, SIMPLIFY = FALSE)
proc.time() - ptm3
#user  system elapsed 
#0.91    0.83    1.75 
class(r_test)
#[1] "list"
length(r_test)
#[1] 99
#test for equality
all.equal(r[[2]], r_test[[1]])
#[1] TRUE
all.equal(r[[100]], r_test[[99]])
#[1] TRUE

d1应
d1
d2
t
u
的维度相同吗?不。如果这有助于澄清:这是一个社交网络应用程序,我根据值I,j之间的关系计算关系,其中j是单位,I是年——因此,当我对此进行分析时,矩阵是X(例如,使用
profr
)似乎
matrix
t
占用了大部分时间。因此,这并不是真正的循环本身,更多的是将列转换为矩阵并形成转置。我想知道这是否不是Rcpp的完美用例……感谢您的建议,尽管可能有点超出我的深度(此应用程序的过度杀戮…也可以等待代码运行)