r - 在 R 中过滤数据帧时排除字符串列中任何多个字符的最佳方法

标签 r dplyr filter

我有一个包含需要过滤的字符串和数字数据的数据框。

library(dplyr)
df <- data.frame (Name  = c("101a,102a", "101b,102b,103b", "103c", "102d,103d", "101,103"),
                  Value = c("2", "3", "4", "5", "6")
                  )

名称中的增补字符只能是a、b、c或d。我想找到一种最佳方法来过滤掉出现过滤器中提供的字符以外的其他字符的所有数据,同时保留名称不包含字符的数据。当使用“a”过滤时,我希望删除包含“b”,“c”或“d”的所有数据,保留第一个和最后一个数据:

Name                Value
"101a,102a"         "2"
"101,102,103"       "6"

我可以用 if elses 来做到这一点

If (char=="a") {
    df <- filter(df, (!grepl("b", Name) | !grepl("c", Name) | !grepl("d", Name))
} else if (char=="b") {
    df <- filter(df, (!grepl("a", Name) | !grepl("c", Name) | !grepl("d", Name))
} else if (char=="c") {
    df <- filter(df, (!grepl("a", Name) | !grepl("b", Name) | !grepl("d", Name))
} else if (char=="d") {
    df <- filter(df, (!grepl("a", Name) | !grepl("b", Name) | !grepl("c", Name))
}

但我希望有人可以帮助我编写更高效、更短的代码。我正在寻找基本上可以执行此操作的代码:

“从'a,b,c,d'中删除字符并过滤掉Name不包含任何剩余字符的所有数据”。

我尝试过:

abcd <- c("a", "b", "c", "d")
df <- filter(df, !Name %in% abcd[!abcd==char])

但是%in%似乎使用了match,需要完美匹配,所以我尝试了

df <- filter(!grepl(paste(abcd[!abcd==char], collapse="|"),Name))

但我无法获得正确的语法。我想我需要一些帮助来创建

(!grepl("a", Name) | !grepl("b", Name) | !grepl("c", Name))

动态部分。

最佳答案

使用paste创建一个不包含所需字符的正则表达式。然后filter否定grepl的结果。

suppressPackageStartupMessages(
  library(dplyr)
)

df <- data.frame(Name  = c("101a,102a", "101b,102b,103b", "103c", "102d,103d", "101,103"),
                 Value = c("2", "3", "4", "5", "6"))

abcd <- c("a", "b", "c", "d")

char <- "a"

discard <- paste(abcd[abcd != char], collapse = "|")
filter(df, !grepl(discard, Name))
#>        Name Value
#> 1 101a,102a     2
#> 2   101,103     6

创建于 2023 年 5 月 28 日 reprex v2.0.2


基本的 R 方式如下。

char <- "a"

discard <- paste(abcd[abcd != char], collapse = "|")
df[grep(discard, df$Name, invert = TRUE), ]
#>        Name Value
#> 1 101a,102a     2
#> 5   101,103     6

创建于 2023 年 5 月 28 日 reprex v2.0.2

关于r - 在 R 中过滤数据帧时排除字符串列中任何多个字符的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76353293/

相关文章:

R - 删除字符向量中以大写字母开头的字符串

r - 在shinyapps.io 上 sleep shinyapp

r - Barplot 不评估 R 中的数据

r - dplyr : summarise a variable given as a character string 中的标准评估

r - 如何在 R 中使用 Dataframe 创建所需的矩阵

algorithm - 布隆过滤器或布谷鸟哈希?

json - JSONPath 中的多个过滤器

mysql - 在 R 中组合多个 MySQL 表的最佳方法

R:错误:在 dplyr 中使用 unnest 时长度不兼容

javascript - 通过管道同时允许多个过滤器值 - Angular