我有一个像这样的数据框:
d <- data.frame(cbind(x=1, y=1:10, z=c("apple","pear","banana","A","B","C","D","E","F","G")), stringsAsFactors = FALSE)
我想从此数据框中删除一些行,具体取决于列z的内容:
new_d <- d[-grep("D",d$z),]
这很好用;第7行现已删除:
new_d
x y z
1 1 1 apple
2 1 2 pear
3 1 3 banana
4 1 4 A
5 1 5 B
6 1 6 C
8 1 8 E
9 1 9 F
10 1 10 G
但是,当我使用grep搜索列z中不存在的内容时,它似乎删除了数据帧的所有内容:
new_d <- d[-grep("K",d$z),]
new_d
[1] x y z
<0 rows> (or 0-length row.names)
我想以这种或其他方式搜索和删除行,即使我搜索的字符串不存在。如何解决这个问题?
答案 0 :(得分:20)
您可以使用TRUE / FALSE子集而不是数字。
grepl
与grep类似,但它会返回logical
向量。否定与它一起工作。
d[!grepl("K",d$z),]
x y z
1 1 1 apple
2 1 2 pear
3 1 3 banana
4 1 4 A
5 1 5 B
6 1 6 C
7 1 7 D
8 1 8 E
9 1 9 F
10 1 10 G
答案 1 :(得分:7)
这是你的问题:
> grep("K",c("apple","pear","banana","A","B","C","D","E","F","G"))
integer(0)
尝试使用grepl():
d[!grepl("K",d$z),]
这是有效的,因为否定的逻辑向量每行都有一个条目:
> grepl("K",d$z)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> !grepl("K",d$z)
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
答案 2 :(得分:3)
为了完整性,从R 3.3.0开始,grep
和朋友都带有invert
参数:
new_d <- d[grep("K", d$z, invert = TRUE)]
答案 3 :(得分:1)
您希望在这种情况下使用grepl
,例如new_d <- d[! grepl("K",d$z),]
。