将过滤条件应用于包含/以R中的某些字符串开头的变量

时间:2020-10-31 03:46:07

标签: r string dplyr stringr

我正在尝试找到一种方法,该方法根据应用于名称包含特定字符串的变量的条件来过滤数据框

在下面的示例中, 我想找到其任何测试结果都包含“ 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测试4 1 b b b c d 2天 3 e a d f

输出是我所需要的,但是我正在寻找一种更简单的方法,例如,是否可以将过滤条件应用于包含“ test”一词的变量 我了解dplyr中的contain函数来选择某些变量,我在这里尝试了一下但没有用,

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

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

谢谢

1 个答案:

答案 0 :(得分:2)

在基数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')))