【发布时间】:2021-12-28 12:14:18
【问题描述】:
我正在处理一些实验数据,我需要将参考数据和处理数据一起比较。我有两个 data.frames,目标是创建两个 data.frames 行的所有组合,并检查两行的 setdiff 是否大于 10,并将行 ID 保存到有匹配项的列表中。
我准备了一个通用的解决方案,如下所示:
set.seed(42) ## for sake of reproducibility
df1 <- data.frame(a = rpois(150, 2), b = rpois(150, 2))
df2 <- data.frame(a = rpois(150, 10), b = rpois(150, 14))
out <- vector("list", nrow(df1))
names(out) <- rownames(df1)
for (i in seq_len(nrow(df1))) {
map <- NULL
for (j in seq_len(nrow(df2))) {
if (all(setdiff(c(df2[j, ]), c(df1[i, ])) > 10)) {
map <- c(map, j)
}
}
out[[i]] <- map
}
问题在于,对于非常大的数据帧(超过 30 000 行),这是一个非常缓慢的解决方案。我不确定如何加快这个 for 循环。如有任何建议,我将不胜感激。
【问题讨论】:
标签: r loops for-loop set-difference