【发布时间】:2018-02-01 22:35:11
【问题描述】:
出于速度原因,我在将嵌套的 for 循环转换为 lapply() 时遇到困难。
我有 2 个data.tables 循环遍历每一行以比较其内容,如果相等,则进行一些计算。我花了 10 多分钟来计算大约 1000 行和 360 行的数据集。
在这个最小的例子中,它不到一秒,但每行只有 3 行:
library(data.table)
library(tictoc)
name <- c(rep("apple",2), rep("banana",2), rep("citrus", 2))
stim <- c("nc","alk" ,"nc", "lem", "haz", "nc")
vis <- c(1, 1, 1, 1, 6, 7)
f <-c(2,2,2,1,3,3)
g <-c(2,2,2,2,4,4)
h <- c(rep(2,6))
value<- c(5,10,5,10,10,5)
tab <- data.table(name, stim, vis, f,g,h,value)
tab1 <- tab[stim == "nc"]
tab2 <- tab[!(stim == "nc")]
tic("looping")
for(i in 1:NROW(tab1)){
for (n in 1: NROW((tab2))){
if(identical(tab2[n,name],tab1[i,name])
& identical(tab2[n,vis],tab1[i,vis])
& identical(tab2[n,3:(length(tab2)-1), with = FALSE],tab1[i,3:(length(tab1)-1), with = FALSE])){
tab2[n,"value"] <- tab2[n, "value"] - tab1[i,"value"]
}
}
}
toc()
我一直在关注apply 家庭,这似乎是一种方法,但我不知道如何解决它。感谢您的帮助!
编辑:
在循环之前,tab1 看起来像这样:
name stim vis f g h value
1: apple nc 1 2 2 2 5
2: banana nc 1 2 2 2 5
3: citrus nc 7 3 4 2 5
tab2 看起来像这样:
name stim vis f g h value
1: apple alk 1 2 2 2 10
2: banana lem 1 1 2 2 10
3: citrus haz 6 3 4 2 10
循环后(只对tab2感兴趣),预期结果:
name stim vis f g h value
1: apple alk 1 2 2 2 5
2: banana lem 1 1 2 2 10
3: citrus haz 6 3 4 2 10
【问题讨论】:
-
你能解释一下使用的条件吗?
-
例如,如果我想将
tab1的每一行与整个tab2绑定,那么我会执行以下操作:Map(function(x,y)cbind(x[rep(1,nrow(y))],y),split(tab1,1:3),list(tab2))。因此,您需要定义您需要为tab1和tab2执行的操作,其中有cbind函数 -
我不想绑定任何东西。我正在检查两个不同 data.table 的每一行的某些列是否相同,如果是,则对这两行进行一些计算。
-
我只是举一个 cbind 的例子..
-
对不起。我误会了。我会尝试你的方法并回来
标签: r performance for-loop nested-loops