从一个数据框中删除在另一个数据框中存在的数据。 (R语言)

7

我希望从一个数据框中删除另一个数据框中存在的数据。让我举个例子:

letters<-c('a','b','c','d','e')
numbers<-c(1,2,3,4,5)
list_one<-data.frame(letters,numbers)

我想从list_one中删除所有与另一个数据框中的字母匹配的行:

letters2<-c('a','c','d')
list_two<-data.frame(letters2)

我应该提到,我实际上正在尝试处理两个大型csv文件,因此我无法使用负表达式-删除行。

我需要创建一个最终数据框,其中仅包含字母b和e及其对应的数字。我该如何做呢?

我是R的新手,所以很难在不确定关键术语的情况下研究问题。感谢任何帮助!


顺便提一下,letters实际上是一个常量/内置向量,LETTERS也是。 - Frank
3个回答

9

dplyr解决方案

library(dplyr)

list_one %>% anti_join(list_two)

5

基本的 R 解决方案

list_one[!list_one$letters %in% list_two$letters2,]

为您提供:

  letters numbers
2       b       2
5       e       5

说明:

> list_one$letters %in% list_two$letters2
[1]  TRUE FALSE  TRUE  TRUE FALSE

这将给你一个向量,LENGTH == length(list_one$letters),其中包含TRUE/FALSE值。 ! 反转这个向量。因此,如果该值存在于list_two$letters2中,则最终会得到FALSE/TRUE值。
如果您对如何从数据框中选择行有疑问,请输入:
?`[.data.frame`

将其输出到控制台并读取。


1

回答你的编辑:

“所以我真的不能使用否定表达式”。

我想最有效的方法之一是使用data.table,如下所示:

require(data.table)
setDT(list_one)
setDT(list_two)
list_one[!list_two, on=c(letters = "letters2")]

或者

require(data.table)
setDT(list_one, key = "letters")
setDT(list_two, key = "letters2")
list_one[!letters2]

结果:

   letters numbers
1:       b       2
2:       e       5

请看?"data.table"用data.table::fread快速读取大型数据框架的原因,了解为什么应该首先使用data.table::fread来读取csv文件。
顺便说一句:如果你有letters2而不是list_two,可以使用。
list_one[!J(letters2)]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接