如何从df子集中包括grep匹配的多列

问题描述 投票:1回答:2

我有一个非常大的数据集,其中包含多列名称相同的部分(例如ctq_1,ctq_2,ctq_3以及panas_1,panas_2,panas_3)。我想将这些列中的某些列(例如,仅列名称中包含“ panas”的那些列)与同一数据框中具有唯一名称(例如id,group)的某些其他列一起子集化。

我尝试在方括号内使用grep函数,效果很好:panas 114中找不到列115116117118.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)))的错误):未定义的列已选择

r dataframe match subset partial
2个回答
1
投票

grep返回匹配的位置,并且在对列进行子设置时不能混合列名称和位置。子集完全按名称或按位置排列。

以名称命名子集

panas <- bigdata[,c('id', 'group', grep('panas', colnames(bigdata), value = TRUE))] 

或按位置分组

panas <- bigdata[ , c(1:2, grep('panas', colnames(bigdata))]

假设1:2idgroup列的列位置。


1
投票

假设我了解您想要做什么,一个可能没有用和/或可能多余的解决方案:

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

© www.soinside.com 2019 - 2024. All rights reserved.