首页 文章

检查数据帧的每一行是否包含在另一个数据帧中

提问于
浏览 1467
6

我写了以下函数,它的工作原理 . 但是,当 df1 有1700行时,它非常慢, df2 有70000行 . 反正有提高效率吗?

rowcheck <- function(df1, df2){
         apply(df1, 1, function(x) any(apply(df2, 1, function(y) all(y==x))))
}

我写这个函数应用的一个例子是:我想检查df1中的每一行是否包含在df2中的一行:

df1=data.frame(a=c(1:3),b=c("a","b","c"))
df2=data.frame(a=c(1:6),b=rep(c("a","b","c"),2))

对于df1的每一行,我想检查它是否包含在df2中的一行中 . 我想将函数返回为长度为nrow(df1)的逻辑向量 .

谢谢您的帮助 .

3 回答

  • 7

    尝试:

    Filter(function(x) x > 0, which(duplicated(rbind(df2, df1))) - nrow(df2))
    

    它会告诉你 df1 中的哪些行号出现在 df2 中 . 如果你想要一个像Richard Scriven的答案那样的逻辑原子向量,试试吧

    duplicated(rbind(df2, df1))[-seq_len(nrow(df2))]
    

    它也更快,因为它使用内部C函数 duplicated (我的是 rowcheck2

    > microbenchmark(rowcheck(df1, df2), rowcheck2(df1, df2))
     Unit: milliseconds
                    expr      min       lq   median       uq       max neval
      rowcheck(df1, df2) 2.045210 2.169182 2.328296 3.539328 13.971517   100
      rowcheck2(df1, df2) 1.046207 1.112395 1.243390 1.727921  7.442499   100
    
  • 6

    一种方法是将行粘贴在一起,并将它们与 %in% 进行比较 . 结果是一个逻辑向量,长度为 nrow(df1) ,如请求的那样 .

    do.call(paste0, df1) %in% do.call(paste0, df2)
    # [1] TRUE TRUE TRUE
    
  • 0

    只是想在这个查询上给我两分钱 . 基于plyr的解决方案:

    nrow(match_df(df2, df1))
    

    ..将针对df2(相对于所有列)检查df1的每一行,并给出df2中包含的df1的行数 .

相关问题