从另一个数据帧R中存在的一个数据帧中删除数据

时间:2015-10-13 20:31:21

标签: r

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

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的新手,所以当我不太确定要搜索哪些关键词时,很难研究问题。感谢任何帮助,谢谢!

3 个答案:

答案 0 :(得分:3)

基础R解决方案

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

给你:

  letters numbers
2       b       2
5       e       5

Explainaition:

> 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中选择行有疑问,请输入

?`[.data.frame`

到控制台阅读。

答案 1 :(得分:3)

dplyr解决方案

library(dplyr)

list_one %>% anti_join(list_two)

答案 2 :(得分: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]

(感谢Frank的改进)

结果:

   letters numbers
1:       b       2
2:       e       5

首先查看?"data.table"Quickly reading very large tables as dataframes in R有关使用data.table::fread读取csv文件的原因。

顺便说一句:如果你有letters2而不是list_two,你可以使用

list_one[!J(letters2)]