如何使用R?基于外部列表从data.frame中删除行?

Let*_*tin 25 r dataframe

这可能是一个简单的问题,但我仍然需要一些帮助使用R.

我有一个data.frame(main_data),让我们说..

NAMES   AGE     LOC
Jyo     23      Hyd
Abid    27      Kar
Ras     24      Pun
Poo     25      Goa
Sus     28      Kar
Run Code Online (Sandbox Code Playgroud)

我希望根据名称列表删除几行.所以我可以说我有另一个表列表如下:

NAMES_list
Jyo
Ras
Poo
Run Code Online (Sandbox Code Playgroud)

所以基于这个列表,如果任何名称与我上面的"main_data"表匹配,那么我想删除它们的整行,所以结果应该如下

NAMES   AGE     LOC
Abid    27      Kar
Sus     28      Kar
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮我解决这个问题吗?提前致谢.. :)

Jan*_*ary 39

用途%in%:

main_data2 <- main_data[ ! main_data$NAMES %in% NAMES_list, ]
Run Code Online (Sandbox Code Playgroud)


GSe*_*See 11

如果您偶然拥有data.table(而不是a data.frame),并且您data.table拥有a key,则可以使用not join成语

library(data.table)
dat <- as.data.table(read.table(text="
NAMES   AGE     LOC
Jyo     23      Hyd
Abid    27      Kar
Ras     24      Pun
Poo     25      Goa
Sus     28      Kar", 
stringsAsFactors=FALSE, header=TRUE))

setkey(dat, NAMES)

to.remove <- c("Jyo","Ras","Poo")
dat[-dat[to.remove, which=TRUE]]
#   NAMES AGE LOC
#1:  Abid  27 Kar
#2:   Sus  28 Kar
Run Code Online (Sandbox Code Playgroud)

当然,其他两个 答案也适用于a data.table,但这应该更有效.


编辑

从data.table版本1.8.3开始,"!" 前缀可用于"非连接"(请参阅新闻).

dat[!to.remove]
   NAMES AGE LOC
1:  Abid  27 Kar
2:   Sus  28 Kar
Run Code Online (Sandbox Code Playgroud)

  • +1我们真的需要正确的不加入工作不要我们:`dat [-to.remove]`.它实际上很容易在内部实现,但我还没有完成它:(它是[FR#1384](https://r-forge.r-project.org/tracker/index.php?func=detail&aid= 1384&GROUP_ID = 240&ATID = 978). (2认同)

And*_*rie 7

复制您的数据:

dat <- read.table(text="
NAMES   AGE     LOC
Jyo     23      Hyd
Abid    27      Kar
Ras     24      Pun
Poo     25      Goa
Sus     28      Kar", 
stringsAsFactors=FALSE, header=TRUE)

remove <- c("Jyo", "Ras", "Poo")
Run Code Online (Sandbox Code Playgroud)

简单的子集:

dat[!dat$NAMES %in% remove, ]
  NAMES AGE LOC
2  Abid  27 Kar
5   Sus  28 Kar
Run Code Online (Sandbox Code Playgroud)

以下是它的工作原理:使用!否定的组合并%in%返回指示要保留的行的逻辑向量:

!dat$NAMES %in% remove
[1] FALSE  TRUE FALSE FALSE  TRUE
Run Code Online (Sandbox Code Playgroud)

我记得第一次见到这个结构时我很惊讶.为什么它会!dat$NAMES返回任何有用的东西?好吧,当然,洞察力是中缀运算符%in%首先被评估,所以!它只是一个逻辑NOT运算符.