我有2个数据帧。
DF1 -
col1 col2 col3 col4 col5 name1 A 23 x y name1 A 29 x y name1 B 17 x y name1 A 77 x y
DF2 -
col1 col2 col3 B 17 LL1 Z 193 KK1 A 77 LO9 Y 80 LK2
如果df1的col2和col3不等于df2的col1和col2,我想从df1返回这些行。
输出应为 -
col1 col2 col3 col4 col5 name1 A 23 x y name1 A 29 x y
我发现的解决方案 -
unique.rows <- function (df1, df2) {
out <- NULL
for (i in 1:nrow(df1)) {
found <- FALSE
for (j in 1:nrow(df2)) {
if (all(df1[i,2:3] == df2[j,1:2])) {
found <- TRUE
break
}
}
if (!found) out <- rbind(out, df1[i,])
}
out
}
此解决方案工作正常,但最初,我正在申请小型数据帧。现在我的df1有大约10k行,而df2有大约700万行。它刚刚运行并运行了2天。任何人都可以建议一个快速的方法来做到这一点?
答案 0 :(得分:3)
试
> df1[!paste(df1$col2,df1$col3)%in%paste(df2$col1,df2$col2),]
col1 col2 col3 col4 col5
1 name1 A 23 x y
2 name1 A 29 x y
答案 1 :(得分:2)
可能咬你的是:
if (!found) out <- rbind(out, df1[i,])
您不断增长data.frame,这会导致操作系统为该对象分配新内存。我建议您预先分配一个具有足够空间的data.frame,然后将正确的输出分配给正确的索引。这应该可以加快几个数量级。
此外,R工作矢量化,因此通常不需要显式循环。例如,参见@ttmaccer的答案。您还可以查看data.table
,这对于这些操作来说非常快。