8

假设我有一个数据框 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

这可能吗?

4

3 回答 3

10

可以通过

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

为了将其作为一项功能自动化,可以使用 use[来进行子集化。将它与 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
于 2013-10-17T03:30:14.783 回答
1

BaseR现在有一个方便的功能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"))
于 2020-06-30T11:41:00.363 回答
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
于 2020-06-30T11:36:06.840 回答