说我有数据框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
这可能吗?
答案 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"))