Using grep in R to delete rows from a data.frame
我有一个这样的数据框:
1 | d <- data.frame(cbind(x=1, y=1:10, z=c("apple","pear","banana","A","B","C","D","E","F","G")), stringsAsFactors = FALSE) |
我想从此数据框中删除一些行,具体取决于z列的内容:
1 | new_d <- d[-grep("D",d$z),] |
这很好用; 现在删除第7行:
1 2 3 4 5 6 7 8 9 10 11 | 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列中不存在的内容时,似乎删除了数据框的所有内容:
1 2 3 4 | new_d <- d[-grep("K",d$z),] new_d [1] x y z <0 rows> (or 0-length row.names) |
我想以这种或另一种方式搜索和删除行,即使我搜索的字符串不存在。 怎么办呢?
您可以使用TRUE / FALSE子设置而不是数字。
1 2 3 4 5 6 7 8 9 10 11 12 | 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 2 | > grep("K",c("apple","pear","banana","A","B","C","D","E","F","G")) integer(0) |
尝试使用grepl():
1 | d[!grepl("K",d$z),] |
之所以可行,是因为取反的逻辑向量每行都有一个条目:
1 2 3 4 | > 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 |
为了完整起见,从R 3.3.0开始,
1 | new_d <- d[grep("K", d$z, invert = TRUE)] |
在这种情况下,您想使用