我有一个包含需要过滤的字符串和数字数据的数据框。
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/