我想从另一个数据帧中存在的数据框中删除数据。让我举个例子:
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的新手,所以当我不太确定要搜索哪些关键词时,很难研究问题。感谢任何帮助,谢谢!
答案 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)]