我有一个非常大的数据集,其中包含多列名称相同的部分(例如ctq_1,ctq_2,ctq_3以及panas_1,panas_2,panas_3)。我想将这些列中的某些列(例如,仅列名称中包含“ panas”的那些列)与同一数据框中具有唯一名称(例如id,group)的某些其他列一起子集化。
我尝试在方括号内使用grep函数,效果很好:panas 114中找不到列115
,116
,117
,118
,.data
,…(以及另外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
这次,错误是:
[.data.frame
(iris,,c(“ Species”,grep(“ Petal”,colnames(iris)))的错误):未定义的列已选择
grep
返回匹配的位置,并且在对列进行子设置时不能混合列名称和位置。子集完全按名称或按位置排列。
以名称命名子集
panas <- bigdata[,c('id', 'group', grep('panas', colnames(bigdata), value = TRUE))]
或按位置分组
panas <- bigdata[ , c(1:2, grep('panas', colnames(bigdata))]
假设1:2
是id
和group
列的列位置。
假设我了解您想要做什么,一个可能没有用和/或可能多余的解决方案:
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")
“一个简单的选项是使用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
<< [Note但是,在上述功能中,由于首先选择了最后提供的名称,因此反直觉地选择了列。
第一部分的结果(被截断): 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