这可能是一个简单的问题,但我仍然需要一些帮助使用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)
复制您的数据:
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运算符.