【问题标题】:subset with pattern带模式的子集
【发布时间】:2022-02-24 00:18:38
【问题描述】:

假设我有一个数据框 df

df <- data.frame( a1 = 1:10, b1 = 2:11, c2 = 3:12 )

我希望对列进行子集化,但使用模式

df1 <- subset( df, select= (pattern = "1") )

得到

> df1
   a1 b1
1   1  2
2   2  3
3   3  4
4   4  5
5   5  6
6   6  7
7   7  8
8   8  9
9   9 10
10 10 11

这可能吗?

【问题讨论】:

标签: r


【解决方案1】:

可以通过

subset(df, select = grepl("1", names(df)))

为了将其作为一项功能自动化,可以使用 [ 进行子集化。将它与 R 的正则表达式函数之一结合起来,您就拥有了所需的一切。

举个例子,这是一个实现我上面提到的想法的自定义函数。

Subset <- function(df, pattern) {
  ind <- grepl(pattern, names(df))
  df[, ind]
}

请注意,这不会进行错误检查等,只是依靠grepl 返回一个逻辑向量,指示哪些列与pattern 匹配,然后将其传递给[ 以按列设置子集。应用于您的df 这给出:

> Subset(df, pattern = "1")
   a1 b1
1   1  2
2   2  3
3   3  4
4   4  5
5   5  6
6   6  7
7   7  8
8   8  9
9   9 10
10 10 11

【讨论】:

    【解决方案2】:

    相同但不同:

    df2 <- df[, grep("1", names(df))]
       a1 b1
    1   1  2
    2   2  3
    3   3  4
    4   4  5
    5   5  6
    6   6  7
    7   7  8
    8   8  9
    9   9 10
    10 10 11
    

    【讨论】:

      【解决方案3】:

      基地R现在有一个便利功能endsWith()

      df[, endsWith(names(df), "1")]
      

      data.table 你可以这样做:

      library(data.table)
      setDT(df)
      df[, .SD, .SDcols = patterns("1")]
      # Or more precisely
      df[, .SD, .SDcols = patterns("1$")]
      

      dplyr:

      library(dplyr)
      select(df, ends_with("1"))
      

      【讨论】:

        猜你喜欢
        • 2018-06-02
        • 1970-01-01
        • 1970-01-01
        • 2011-05-18
        • 2017-07-07
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 2012-07-23
        相关资源
        最近更新 更多