【问题标题】:Extract multiple variables by naming convention, for more than two types of naming convention通过命名约定提取多个变量,用于两种以上的命名约定
【发布时间】:2021-03-24 08:09:06
【问题描述】:

我正在尝试提取以某些字符串开头的多个变量。对于这个例子,我想编写一个代码来提取所有以 X1 和 Y2 开头的变量。

set.seed(123)
df <- data.frame(X1_1=sample(1:5,10,TRUE),
                 X1_2=sample(1:5,10,TRUE),
                 X2_1=sample(1:5,10,TRUE),
                 X2_2=sample(1:5,10,TRUE),
                 Y1_1=sample(1:5,10,TRUE),
                 Y1_2=sample(1:5,10,TRUE),
                 Y2_1=sample(1:5,10,TRUE),
                 Y2_2=sample(1:5,10,TRUE))

我知道我可以使用以下方法提取以“X1”开头的变量

Vars_to_extract <- c("X1")
tempdf <- df[ , grep( paste0(Vars_to_extract,".*" )  , names(df), value=TRUE)]
  X1_1 X1_2
1    3    5
2    3    4
3    2    1
4    2    2
5    3    3

但是我需要修改上面的代码来提取变量多个变量类型,如果这样指定的话

Vars_to_extract

我一直在尝试在 grep 部分中使用 %in%.*,但收效甚微。我知道我可以编写以下非常手动的代码,分别合并每组变量。

tempdf <- data.frame(df[, grep("X1.*", names(df), value=TRUE)] , df[, grep("Y2.*", names(df), value=TRUE)] )
  X1_1 X1_2 Y2_1 Y2_2
1    3    5    1    5
2    3    4    1    5
3    2    1    2    3
4    2    2    3    1
5    3    3    4    2

但是,在现实世界的情况下,我经常处理大量变量,并且必须多次这样做。是否可以使用 %in% 以这种方式编写它,还是需要使用循环?任何帮助或提示将不胜感激。谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    如果我们想提取在字符串中任意位置具有子字符串的列名,我们可以使用contains

    library(dplyr)
    df %>%
        select(contains(Vars_to_extract))
    

    或者使用matches,我们可以使用正则表达式来指定以特定子字符串开头的字符串(^

    library(stringr)
    df %>%
          select(matches(str_c('^(', Vars_to_extract, ')', collapse="|")))
    

    使用grep,我们可以通过pastecollapse = "|" 创建单个模式

    df[grep(paste0("^(",paste(Vars_to_extract, collapse='|'), ")"), names(df))]
    #    X1_1 X1_2 Y2_1 Y2_2
    #1     3    5    5    3
    #2     3    3    5    5
    #3     2    3    3    3
    #4     2    1    1    2
    #5     3    4    4    5
    #6     5    1    1    5
    #7     4    1    1    3
    #8     1    5    3    2
    #9     2    3    4    2
    #10    3    2    1    2
    

    或者另一种方法是 startsWithlapplyReduce

    df[Reduce(`|`, lapply(Vars_to_extract, startsWith, x = names(df)))]
    

    【讨论】:

    • 变量需要以指定变量X1开头,而不是包含它。因为可能还有其他变量也有 X1 作为其名称的一部分。包含函数可能会提取一个名为 ABCX1 的变量
    • @H.Cheung 尝试更新,即使用pastestr_c
    • @H.Cheung 如果你能提供一个例子说明它不适用于paste,那就太好了
    • 我刚刚测试了我的一些“真实”世界数据。使用 grep 和 reduce 的方法都有效。它似乎工作。极好的。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2014-08-07
    • 1970-01-01
    • 2013-06-12
    相关资源
    最近更新 更多