【发布时间】:2017-10-26 15:31:03
【问题描述】:
我有一个以下格式的df,并尝试获取一个包含每组所有成对组合的数据框
df<-structure(list(id = c(209044052, 209044061, 209044061, 209044061,209044062, 209044062, 209044062, 209044182, 209044183, 209044295), group = c(2365686, 387969, 388978, 2365686, 387969, 388978, 2365686, 2278460, 2278460, 654238)), .Names = c("id", "group"), row.names = c(NA, -10L), class = "data.frame")
虽然 do.call(rbind, lapply(split(df, df$group), function(i) expand.grid(i$id, i$id))) 适用于小型数据框,但我在大型数据(约 1200 万个观测值和约 150 万个组)上遇到了时间问题。
经过一些测试,我发现 split 命令似乎是瓶颈,而 expand.grid 也可能不是最快的解决方案。
发现 expand.grid Use outer instead of expand.grid 的一些改进 和一些更快的拆分替代品Improving performance of split() function in R?,但很难通过分组将它们放在一起。
输出应该类似于
Var1 Var2
209044061 209044061
209044062 209044061
209044061 209044062
209044062 209044062
209044061 209044061
209044062 209044061
209044061 209044062
209044062 209044062
209044295 209044295
209044182 209044182
209044183 209044182
....
作为额外的,我想排除同一对的重复,自我引用(例如以上209044061 209044061)并且只保留一个组合,如果它们以不同的顺序(例如以上209044061 209044062和209044062 209044061) (没有重复的组合)。用 'combinations()` 尝试了 library(gtools),但无法确定这是否会进一步减慢计算速度。
【问题讨论】:
-
可能
data.table?library(data.table); setDT(df)[, expand.grid(id, id), by = group]