我有一些中等大小的数据帧,需要对数据中的不同列进行计算;例如,我想比较一个数据帧中的列i与另一个数据帧中的i-1。我目前使用for循环。该计算涉及每对值的逐元素比较,因此比较慢:我将每一列数据转换为矩阵,然后与自身的转置进行比较(还有一些其他复杂性)。在我的应用程序(数据具有约100列和3000行)中,当前大约需要95秒。我正在寻找提高效率的方法。如果要比较每个数据帧的SAME列,我将尝试使用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
这在我的计算机上大约需要3秒钟;如前所述,实际计算比该MWE建议的要复杂一些。显然,这也可以提高计算本身的效率,但是我正在寻找一种解决方案,以解决“比较第i列与第i-1列”的问题。
答案 0 :(得分:1)
根据您的示例,如果根据要比较的列提前对齐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