根据两个不同的标准筛选多个字符串列-关于“grepl”和“starts_with”的问题

根据两个不同的标准筛选多个字符串列-关于“grepl”和“starts_with”的问题,r,select,filter,dplyr,grepl,R,Select,Filter,Dplyr,Grepl,我想使用dplyr中的select和filter函数创建数据的子集。我咨询了一些关于和的类似问题,但没有找到解决问题的方法 我要筛选的列都以相同的字母开头,比如DGN。所以我有DGN1,DGN2,DGN3,等等,一直到DGN25。我想筛选的两个条件包含C18,以153开头 理想情况下,我希望运行如下所示的代码块: dgn_subset <- df %>% select(ID, date, starts_with("DGN") %>% filt

我想使用dplyr中的select和filter函数创建数据的子集。我咨询了一些关于和的类似问题,但没有找到解决问题的方法

我要筛选的列都以相同的字母开头,比如DGN。所以我有DGN1,DGN2,DGN3,等等,一直到DGN25。我想筛选的两个条件包含C18,以153开头

理想情况下,我希望运行如下所示的代码块:

dgn_subset <- df %>%
    select(ID, date, starts_with("DGN") %>%
    filter(grepl("C18"|starts_with("153"), starts_with("DGN")))
这里有两个主要问题- 我认为grepl不能将starts_作为模式的输入。此外,它不能将starts_with作为列参数,我认为它一次只能过滤一列

为了让代码正常工作,我可以用153替换starts_,用DGN1替换starts_,用DGN1替换starts_,用DGN1替换starts_,但这给了我很多我不想要的观察结果,它只在第一个DGN列上过滤

是否有其他功能或软件包可用于解决我的问题? 非常感谢您的帮助

我们可以使用带交叉的过滤器。当我们使用c_循环遍历列时,在select_helpers starts_with中指定列名匹配,通过grepl检查C18或|以^153开头的数字获得逻辑输出

或使用过滤器_

数据 我们可以使用带交叉的过滤器。当我们使用c_循环遍历列时,在select_helpers starts_with中指定列名匹配,通过grepl检查C18或|以^153开头的数字获得逻辑输出

或使用过滤器_

数据 在base R中,您可以使用StartWith选择要查找的列,使用sapply检查这些列中的模式。使用rowSums计算该模式在每行中出现的次数,然后选择至少出现一次的行

cols <- startsWith(names(df), 'DGN')
df[rowSums(sapply(df[cols], grepl, pattern = 'C18|^153')) > 0, ]
在base R中,您可以使用StartWith选择要查找的列,使用sapply检查这些列中的模式。使用rowSums计算该模式在每行中出现的次数,然后选择至少出现一次的行

cols <- startsWith(names(df), 'DGN')
df[rowSums(sapply(df[cols], grepl, pattern = 'C18|^153')) > 0, ]

如果您包含一个简单的示例输入和所需的输出,可以用来测试和验证可能的解决方案,那么就更容易为您提供帮助。请注意,grepl采用正则表达式,但不适用于starts_,因为starts_是一种特殊的dplyr。您可以使用“带过滤器的交叉”一次检查多个列。@MrFlick非常感谢您。快速提问-是否会对每一列或任何一列中的模式进行过滤?我忘了提到我只是在25列中的任何一列中寻找模式。如果您包含一个简单的示例输入和所需的输出,可以用来测试和验证可能的解决方案,那么就更容易帮助您。请注意,grepl采用正则表达式,但不适用于starts_,因为starts_是一种特殊的dplyr。您可以使用“带过滤器的交叉”一次检查多个列。@MrFlick非常感谢您。快速提问-是否会对每一列或任何一列中的模式进行过滤?我忘了提到我只是在25列中的任何一列中寻找模式。谢谢!不幸的是,我返回了0个观察值,应该有几千个,所以我可以指定所有以153开头的组合。~在这里到底做了什么?@emomura你能用一个小例子来更新你的帖子吗it@emomura你能查一下我的最新情况吗。我测试了一个小的可复制的例子,效果非常好!非常感谢你。忘了提到我在任何一列中寻找这些标准,不是全部——我的错。谢谢!不幸的是,我返回了0个观察值,应该有几千个,所以我可以指定所有以153开头的组合。~在这里到底做了什么?@emomura你能用一个小例子来更新你的帖子吗it@emomura你能查一下我的最新情况吗。我测试了一个小的可复制的例子,效果非常好!非常感谢你。忘了提到我在任何一列中寻找这些标准,不是全部——我的错。
df <-  data.frame(ID = 1:3, DGN1 = c("2_C18", 32, "1532"), 
          DGN2 = c("24", "C18_2", "23"))
cols <- startsWith(names(df), 'DGN')
df[rowSums(sapply(df[cols], grepl, pattern = 'C18|^153')) > 0, ]
df[Reduce(`|`, lapply(df[cols], grepl, pattern = 'C18|^153')), ]