meilinvhai
比如下面这两列数据,想要选出时间=2011,品牌中不包含“奥迪”的所有行。用R语句是怎么写呢?谢谢
时间 品牌
2010 奥迪A4L
2011 宝马3系
2010 宝马5系
2011 奥迪A6L
2001 奔驰
2013 宝马
2014 奥迪A4L
2013 奔驰
2012 奥迪
2011 奥迪A4L
ryo
subset 或 filter 不就得了?
yewuti
加载dplyr包,选择filter函数
filter(x,year==2011&brand!="audi")
x是data.frame数据或者tbl数据。
meilinvhai
[未知用户]
谢谢!我刚试了一下,结果不太对呢,希望 品牌列 中只要含有“奥迪”这两个字的就不要,也就是说要除去“奥迪A4L,奥迪A6L”这些。
最终的结果应该是:2011 宝马3系
meilinvhai
[未知用户]
恩,但是还有一个小细节
yewuti
[未知用户]
奇怪,为什么我操作的时候,最后结果输出只有“2011 BMW”,你再试试看,不行的话看help文件。
meilinvhai
[未知用户]
好的,谢谢!
meilinvhai
[未知用户]
你好,可否截个图,我试了几遍还是不行
Simplicissimus
## FOR THE DATA("dat")
dat <- data.frame(time = c(2010, 2011, 2010, 2011, 2001,
2013, 2014, 2013, 2012, 2011),
brand = c("奥迪A4L", "宝马3系", "宝马5系", "奥迪A6L", "奔驰",
"宝马", "奥迪A4L", "奔驰", "奥迪", "奥迪A4L"))
## SUBSETTING
dat[["audi"]] <- FALSE
dat[grep(pattern = "奥迪", x = dat[["brand"]]), "audi"] <- TRUE
dat[(dat[["audi"]] == FALSE) & (dat[["time"]] == 2011), ]
这个问题非常妖孽 :?: 。如果直接执行如下语句,则会显示出错。
dat[(dat[["time"]] == 2011) & (-c(grep(pattern = "奥迪", x = dat[["brand"]]))), ] # WRONG
但是分别筛选年和是否含有“奥迪”并不会出错
dat[ -c(grep(pattern = "奥迪", x = dat[["brand"]])), ]
dat[dat[["time"]] == 2011, ]
meilinvhai
[未知用户]
多谢多谢呢,把两个条件放在一起出现错误,我认为原因是grep得出的结果是一个向量,也就是符合模糊匹配的行数,不能把它直接和另一个条件放一起。
Simplicissimus
[未知用户]
你讲的有道理。我觉得本质原因是位置匹配与条件匹配不能混用。混用的时候,以位置匹配会被忽略。
请看,以下三条语句:
dat[c(2,3,5,6,8) & dat[["audi"]] == TRUE, ]
dat[c(2,3,5,6,8) & dat[["audi"]] == FALSE, ]
dat[c(1,4,7,9,10) & dat[["audi"]] == FALSE, ]
如果把grep的返回值改为向量值,那么结果也是正确的。如下:
dat[dat[["year"]] == 2011 &
!dat[["brand"]] %in% grep(pattern = "奥迪", x = dat[["brand"]], value = TRUE), ]
meilinvhai
[未知用户]
正解!!!!! :-)
recluseqy
dat[dat$time==2011&!grepl('奥迪',dat$brand),]
meilinvhai
[未知用户]
厉害!语句更简洁了~谢谢~ :blush: