模式的子集

时间:2013-10-17 03:20:43

标签: r

说我有数据框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

这可能吗?

3 个答案:

答案 0 :(得分:8)

可以通过

执行此操作
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

答案 1 :(得分:1)

相同但不同:

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

答案 2 :(得分:0)

基础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, contains("1"))
# Or more precisely
select(df, ends_with("1"))