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

时间:2012-10-22 13:29:15

标签: 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

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

NAMES_list
Jyo
Ras
Poo

所以根据这个列表,如果任何一个名字与我上面的“main_data”表匹配,那么我想删除它们的整行,所以结果应如下所示

NAMES   AGE     LOC
Abid    27      Kar
Sus     28      Kar

任何人都可以帮我解决这个问题吗? 在此先感谢.. :))

4 个答案:

答案 0 :(得分:34)

使用%in%

main_data2 <- main_data[ ! main_data$NAMES %in% NAMES_list, ]

答案 1 :(得分:10)

如果您偶然拥有data.table(而不是data.frame),并且data.tablekey,则可以使用不加入成语

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

当然,其他two answers也适用于data.table,但这应该更有效。


修改

从data.table版本1.8.3开始,“!”前缀可用于“非连接”(请参阅​​NEWS)。

dat[!to.remove]
   NAMES AGE LOC
1:  Abid  27 Kar
2:   Sus  28 Kar

答案 2 :(得分:6)

复制您的数据:

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")

简单的子集:

dat[!dat$NAMES %in% remove, ]
  NAMES AGE LOC
2  Abid  27 Kar
5   Sus  28 Kar

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

!dat$NAMES %in% remove
[1] FALSE  TRUE FALSE FALSE  TRUE

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

答案 3 :(得分:0)

如果main_data $ NAMES中有唯一值,您也可以使用match

NAMES_list <- c("Jyo","Ras","Poo")
main_data <- main_data[-match(NAMES_list,main_data$NAMES),]
main_data
  NAMES AGE LOC
2  Abid  27 Kar
5   Sus  28 Kar

它将使用main_data $ NAMES删除与您的NAMES_list完全匹配的行。