使用外部列表从行中删除数据

时间:2019-02-11 14:57:06

标签: r

我有一个数据框

df <- data.frame(
    A = c(4, 2, 7),
    B = c(3, 3, 5),
    C = c("Expert,Foo", "Bar,Wild", "Zap")
  )

和第二个我想用作索引的行,以删除包含特定值的行

mylist <- data.frame(rtext = c("Foo","Bar"))

所以我尝试了这个:

subset(df, C %in% mylist$rtext)

如何删除特定行?

2 个答案:

答案 0 :(得分:3)

由于这是部分匹配,因此我们可以使用grep。我们paste将'myList'列'rtext'的元素转换为带有定界符|的单个字符串,这意味着OR,然后在'C上使用grepl获得逻辑索引'df'的'列,取反(!)将TRUE更改为FALSE,将FALSE更改为TRUE subset,将不在'mylist'的'rtext'中的行更改为

subset(df, !grepl(paste(mylist$rtext, collapse="|"), C))
#   A B   C
#3 7 5 Zap

答案 1 :(得分:3)

使用str_detect中的stringr

df[!stringr::str_detect(df$C,paste(mylist$rtext,collapse = '|')),]
  A B   C
3 7 5 Zap

如果您需要100%匹配,这意味着Foooo将不会被删除,请检查dplyrtidyr重新格式化df 1st,因为str_detectgrepl是部分匹配项,如果您有类似Expert,Foott的单词,它将仍然显示为与Foo匹配项

library(tidyr)
library(dplyr)
df$id=seq.int(nrow(df))
df1=df %>%
        transform(C = strsplit(C, ",")) %>%
        unnest(C)

df[!df$id%in%df1$id[df1$C%in%mylist$rtext],]