如果存在于R中的第二个数据帧中,则排除行

时间:2012-07-17 14:50:11

标签: r compare dataframe

我有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天。任何人都可以建议一个快速的方法来做到这一点?

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,这对于这些操作来说非常快。