将筛选条件应用于R中包含/以特定字符串开头的变量



我正试图找到一种方法,通过应用于变量的标准来过滤数据帧,这些变量的名称包含特定字符串

在下面的这个例子中,我想找到他们的任何测试结果都包含";d";。

d=structure(list(ID = c("a", "b", "c", "d", "e"), test1 = c("a", "b", "a", "d", "a"), test2 = c("a", "b", "b", "a", "s"), test3 = c("b", "c", "c", "c", "d"), test4 = c("c", "d", "a", "a", "f")), class = "data.frame", row.names = c(NA, -5L))

我可以使用dplyr,并使用|一个接一个地编写,这适用于像这样的小示例,但对于我的真实数据来说会很耗时。

library(dplyr) library(stringr) d %>% filter(str_detect(d$test1, "d") |str_detect(d$test2, "d") |str_detect(d$test3, "d") |str_detect(d$test4, "d") )

我得到的结果表明,受试者b、d和e符合标准

ID测试1测试2测试3测试41 b b b c d2 d a c a3 e a s d f

输出是我需要的,但我正在寻找一种更简单的方法,例如,如果有一种方法可以将过滤标准应用于包含单词"的变量;测试";我知道dplyr中用于选择某些变量的contain函数,我在这里尝试过,但不起作用,

d %>% filter(str_detect(contains("test"), "d"))

有没有一种不同的方法来编写这些代码,或者有没有另一种方法来实现相同的目标?

谢谢

在基本R中,您可以使用lapply/sapply:

d[Reduce(`|`, lapply(d[-1], grepl, pattern = 'd')), ]
#d[rowSums(sapply(d[-1], grepl, pattern = 'd')) > 0, ]

#  ID test1 test2 test3 test4
#2  b     b     b     c     d
#4  d     d     a     c     a
#5  e     a     s     d     f

如果您对dplyr解决方案感兴趣,可以使用以下任何方法:

library(dplyr)
library(stringr)
#1.
d %>% 
filter_at(vars(starts_with('test')), any_vars(str_detect(., 'd')))
#2.
d %>%
rowwise() %>%
filter(any(str_detect(c_across(starts_with('test')), 'd')))
#3.
d %>%
filter(Reduce(`|`, across(starts_with('test'), str_detect, 'd')))

相关内容

  • 没有找到相关文章

最新更新