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

问题描述 投票:3回答:2

我有一个数据帧

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)

我如何删除特定行?

r
2个回答
3
投票

由于这是一个部分匹配,我们可以使用grep。我们paste“myList中”列“rtext”的成单个字符串与分隔符|这意味着OR的元素,然后得到与grepl逻辑索引上“DF”的“C”列中,否定(!)来改变TRUE为FALSE和FALSE为TRUE时subset是不是在“MYLIST”的“rtext”的行

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

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月1日,因为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],]
© www.soinside.com 2019 - 2024. All rights reserved.