【问题标题】:select columns based on multiple strings with dplyr contains()使用 dplyr contains() 基于多个字符串选择列
【发布时间】:2015-05-15 02:41:37
【问题描述】:

我想使用 regex 表达式根据它们的名称选择多个列。我正在尝试使用 dplyr 包的管道语法来做到这一点。我检查了其他主题,但只找到了关于单个字符串的答案。

使用基础 R:

library(dplyr)    
mtcars[grepl('m|ar', names(mtcars))]
###                      mpg am gear carb
### Mazda RX4           21.0  1    4    4
### Mazda RX4 Wag       21.0  1    4    4

但是它不适用于选择/包含方式:

mtcars %>% select(contains('m|ar'))
### data frame with 0 columns and 32 rows

怎么了?

【问题讨论】:

    标签: r regex dplyr matching multiple-matches


    【解决方案1】:

    您可以使用matches

     mtcars %>%
            select(matches('m|ar')) %>%
            head(2)
     #              mpg am gear carb
     #Mazda RX4      21  1    4    4
     #Mazda RX4 Wag  21  1    4    4
    

    根据?select 文档

    ‘matches(x, ignore.case = TRUE)’:选择所有符合条件的变量 名称匹配正则表达式“x”

    虽然contains 使用单个字符串

    mtcars %>% 
           select(contains('m'))
    

    【讨论】:

    • 谢谢@akrun,我现在觉得自己很蠢:-)。但是还有一个问题:既然如此,我们为什么还要使用 contains(),如果 matches() 能做同样的事情,甚至更好?
    • @agenis 因为您可能想匹配“.”并且不必考虑如何在正则表达式中对其进行转义
    • @MichaelBellhouse 在这种情况下,您使用paste 即。 paste(yourvec, collapse="|") 并在 matches 中使用它
    • akrun,非常感谢。我已经为此做了很多挖掘和试验。一切顺利。
    • equivalent_for_filter % filter(!grepl(paste(exclude_filter, collapse="|"),variable))
    【解决方案2】:

    你可以使用dplyr包中的contains,如果你给出一个文本选项的向量,像这样:

    mtcars %>% 
           select(contains(c("m", "ar"))
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    【解决方案3】:

    您仍然可以使用基础 R 中的grepl()

    df <- mtcars[ , grepl('m|ar', names(mtcars))]
    

    ...返回子集数据框 df,其中包含列名称中带有 mar 的列

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      • 2023-04-06
      • 2021-11-24
      相关资源
      最近更新 更多