如何从 df 中提取多个列的子集,包括 grep 匹配
How to subset multiple columns from df including grep match
我有一个非常大的数据集,其中包含多个列,这些列的名称具有共同部分(例如 ctq_1、ctq_2、ctq_3 以及 panas_1、panas_2, panas_3).我想将其中一些列(例如,仅在列名称中包含 'panas' 的列)与同一数据框中具有唯一名称(例如 id、组)的某些其他列一起进行子集化。
我尝试在方括号内使用 grep 函数,效果很好:
panas <- bigdata[ , grep('panas', colnames(bigdata))]
但现在我需要弄清楚如何同时包含我需要的其他两列,即 id 和 group。我试过:
panas <- bigdata[ , c('id', 'group', grep('panas', colnames(bigdata)))] 但我收到此错误:
错误:在 .data
中找不到列 114
、115
、116
、117
、118
、…(以及另外 15 个)。
调用 rlang::last_error()
查看回溯。
我怎样才能用最简单的代码实现我想要的东西?我是 R 新手,所以避免花哨的功能是理想的选择!
这是一个可重现的例子。
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
> newframe <- iris[ , grep('Petal', colnames(iris))] # This works
> newframe <- iris[ , c('Species', grep('Petal', colnames(iris)))] # This doesn't work
这一次,错误是:
Error in [.data.frame
(iris, , c("Species", grep("Petal", colnames(iris)))) :
undefined columns selected
grep
returns 匹配的位置,并且在对列进行子集化时不能混合列名和位置。完全按名称或位置子集。
按名字做子集
panas <- bigdata[,c('id', 'group', grep('panas', colnames(bigdata), value = TRUE))]
或按位置子集
panas <- bigdata[ , c(1:2, grep('panas', colnames(bigdata))]
假设 1:2
是 id
和 group
列的列位置。
假设我理解你想做什么,一个可能没有用的解决方案 and/or 可能是多余的:
my_selector <- function(df,partial_name,...){
positional_names <- match(...,names(df))
df[,c(positional_names,grep(partial_name,names(df)))]
}
my_selector(iris, partial_name = "Petal","Species")
A "simpler" 选项是使用 grep
等来立即匹配目标名称:
iris[grep("Spec.*|Peta.*", names(iris))]
或者更简单,正如@akrun 所建议的,我们可以简单地做:
iris[grep("(Spec|Peta).*", names(iris))]
对于更多的专栏,我们可以这样做:
my_selector(iris, partial_name = "Petal",c("Species","Sepal.Length"))
Species Sepal.Length Petal.Length Petal.Width
1 setosa 5.1 1.4 0.2
2 setosa 4.9 1.4 0.2
注意 然而,在上面的函数中,列的选择与直觉相反,因为最后提供的名称首先被选择。
第一部分的结果(截断):
Species Petal.Length Petal.Width
1 setosa 1.4 0.2
2 setosa 1.4 0.2
3 setosa 1.3 0.2
4 setosa 1.5 0.2
5 setosa 1.4 0.2
6 setosa 1.7 0.4
7 setosa 1.4 0.3
我有一个非常大的数据集,其中包含多个列,这些列的名称具有共同部分(例如 ctq_1、ctq_2、ctq_3 以及 panas_1、panas_2, panas_3).我想将其中一些列(例如,仅在列名称中包含 'panas' 的列)与同一数据框中具有唯一名称(例如 id、组)的某些其他列一起进行子集化。
我尝试在方括号内使用 grep 函数,效果很好:
panas <- bigdata[ , grep('panas', colnames(bigdata))]
但现在我需要弄清楚如何同时包含我需要的其他两列,即 id 和 group。我试过:
panas <- bigdata[ , c('id', 'group', grep('panas', colnames(bigdata)))] 但我收到此错误:
错误:在 .data
中找不到列 114
、115
、116
、117
、118
、…(以及另外 15 个)。
调用 rlang::last_error()
查看回溯。
我怎样才能用最简单的代码实现我想要的东西?我是 R 新手,所以避免花哨的功能是理想的选择!
这是一个可重现的例子。
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa
> newframe <- iris[ , grep('Petal', colnames(iris))] # This works
> newframe <- iris[ , c('Species', grep('Petal', colnames(iris)))] # This doesn't work
这一次,错误是:
Error in
[.data.frame
(iris, , c("Species", grep("Petal", colnames(iris)))) : undefined columns selected
grep
returns 匹配的位置,并且在对列进行子集化时不能混合列名和位置。完全按名称或位置子集。
按名字做子集
panas <- bigdata[,c('id', 'group', grep('panas', colnames(bigdata), value = TRUE))]
或按位置子集
panas <- bigdata[ , c(1:2, grep('panas', colnames(bigdata))]
假设 1:2
是 id
和 group
列的列位置。
假设我理解你想做什么,一个可能没有用的解决方案 and/or 可能是多余的:
my_selector <- function(df,partial_name,...){
positional_names <- match(...,names(df))
df[,c(positional_names,grep(partial_name,names(df)))]
}
my_selector(iris, partial_name = "Petal","Species")
A "simpler" 选项是使用 grep
等来立即匹配目标名称:
iris[grep("Spec.*|Peta.*", names(iris))]
或者更简单,正如@akrun 所建议的,我们可以简单地做:
iris[grep("(Spec|Peta).*", names(iris))]
对于更多的专栏,我们可以这样做:
my_selector(iris, partial_name = "Petal",c("Species","Sepal.Length"))
Species Sepal.Length Petal.Length Petal.Width
1 setosa 5.1 1.4 0.2
2 setosa 4.9 1.4 0.2
注意 然而,在上面的函数中,列的选择与直觉相反,因为最后提供的名称首先被选择。
第一部分的结果(截断):
Species Petal.Length Petal.Width
1 setosa 1.4 0.2
2 setosa 1.4 0.2
3 setosa 1.3 0.2
4 setosa 1.5 0.2
5 setosa 1.4 0.2
6 setosa 1.7 0.4
7 setosa 1.4 0.3