从数据框中删除包含一个或多个多个子字符串的行

时间:2018-12-04 20:09:29

标签: r

我想从数据框中删除与一个或多个字符串向量匹配的所有行。简短示例:

words <- c("abcde", "cdefg", "fghij", "efghi", "abcd", "fgh")
numbers <- c(1:6)
dat <- data.frame(words, numbers)

> dat
  words numbers
1 abcde       1
2 cdefg       2
3 fghij       3
4 efghi       4
5  abcd       5
6   fgh       6

我从数据框中删除了所有行,其中列word包含带有循环的strings“ bcd”和“ ghi”中的一个或两个:

strings <- c("bcd", "ghi")

i <- 1
while(i <= length(strings)) {
    dat <- dat[grep(strings[i], dat$words, invert = TRUE),]
    i <- i + 1
}

> dat
  words numbers
2 cdefg       2
6   fgh       6

是最好的方法,还是有更好的方法?

我的真实数据包含将近一百万行,并且需要排除几百个字符串,而且两组数据都在不断增长。因此,“最好”在这种情况下意味着最快并且需要最少的计算能力。


这不是R Subset Dataset Using Regular Expression的副本,因为该问题并未解决我的问题,即使用正则表达式进行子设置是否是 best 方法。

1 个答案:

答案 0 :(得分:1)

您可以使用事实grep接受正则表达式,并使用|(OR)符号同时grep一切:

> dat[grep("bcd|ghi",dat$words,invert=TRUE),]
  words numbers
2 cdefg       2
6   fgh       6

如果您以某种方式将字符串读取到数组中,从而拥有大量字符串,则可以将它们粘贴到|分隔的字符串中,如IceCreamToucan所述:

paste(strings,collapse = '|')