我有一个数据框
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)
如何删除特定行?
答案 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
将不会被删除,请检查dplyr
和tidyr
重新格式化df 1st,因为str_detect
和grepl
是部分匹配项,如果您有类似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],]