【问题标题】:How do I remove rows from dataframe A that match rows in dataframe B, when both dataframes have different number of rows?当两个数据框的行数不同时,如何从数据框 A 中删除与数据框 B 中的行匹配的行?
【发布时间】:2018-11-01 02:26:35
【问题描述】:

我有两个数据框,每个都有一列“电子邮件”。数据框 A 有 60K 行,B 有 700 行。

我想从 A 中删除 B 中的所有电子邮件。

运行它并没有达到我想要的效果。

merge(A, B, "email", all=T)

【问题讨论】:

  • 如果可能,请添加示例数据

标签: r


【解决方案1】:

这是使用基础 R 的一种方法:

A_new <- A[!(A$email %in% B$email), ]

一个例子如下

> a <- c(1:10, 1:10)
> a <- paste0(a, "@hotmail.com")
> b <- c("2@hotmail.com", "3@hotmail.com", "4@hotmail.com")
> c <- a[!(a %in% b) ]
> c
 [1] "1@hotmail.com"  "5@hotmail.com"  "6@hotmail.com"  "7@hotmail.com" 
 [5] "8@hotmail.com"  "9@hotmail.com"  "10@hotmail.com" "1@hotmail.com" 
 [9] "5@hotmail.com"  "6@hotmail.com"  "7@hotmail.com"  "8@hotmail.com" 
[13] "9@hotmail.com"  "10@hotmail.com"

【讨论】:

  • cefh,与问题一样,最好包含文本而不是图像。大多数原因仅与问题有关。一些原因不太明显但仍然很重要,包括:它会破坏屏幕阅读器hard;搜索引擎不阅读它们,因此搜索不会找到它;移动设备的屏幕尺寸可能是一个限制因素。参考:meta.stackoverflow.com/a/285557/3358272。请你?从您的控制台复制输出,编辑答案,粘贴,如果您不熟悉代码格式,请将其全部突出显示并按Ctrl-Kstackoverflow.com/editing-help
【解决方案2】:

一个选项,使用sqldf 库:

library(sqldf)
sql <- "SELECT a.*
        FROM A a LEFT JOIN B b
            ON a.email = b.email
        WHERE b.email IS NULL"
A <- sqldf(sql)

【讨论】:

    【解决方案3】:

    dplyr 版本:

    anti_join(A, B, by = "email")
    

    【讨论】:

    • 当我运行这个时,反连接不会发生。我在控制台中收到此消息:Warning message: Column 'email' joining factors with different levels, coercing to character vector
    • 先将ABdata.frames中的email列转换为带有as.character()的字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 2017-04-15
    • 2021-12-12
    • 2011-10-02
    • 1970-01-01
    • 2019-02-14
    相关资源
    最近更新 更多