2

我有一个数据框和一个向量。该向量有大约 20 个字符串值,它们对应于数据框中的部分列名。数据框有数百个列名。我必须根据向量中存在的部分列名对数据框进行子集化。

例如,如果数据框中的列名称之一是 GRP20R.45.M,则向量中的值之一将是 GRP20R

谢谢

4

2 回答 2

4

假设这v.names 是您的名称向量,您可以使用grepl过滤使用和聚合模式:

patt <- sub(',\\s','|',(toString(v.names)))
id.group <- grepl(patt,colnames(df))
df[,id.group]

这里有一个例子:

v.names <- c('GRP20R','GRP20KA')
df <- data.frame(GRP20R.45.M=1,GRP20KA.25.8=2,hh=1)
patt <- sub(',\\s','|',(toString(v.names)))
id.group <- grepl(patt,colnames(df))
df[,id.group]

 GRP20R.45.M GRP20KA.25.8
1           1            2

其中 df 是:

df
  GRP20R.45.M GRP20KA.25.8 hh
1           1            2  1

编辑班轮解决方案(感谢@thelatemail)

df[,grepl(paste0(v.names,collapse="|"),colnames(df))]
于 2013-07-25T02:54:26.907 回答
2

测试数据:

dat <-  data.frame(
          GRP20R.30.M="a",
          GRP20R.45.M="a",
          GRP40R.30.M="b",
          GRP40R.45.M="b",
          GRP60R.30.M="c",
          GRP60R.45.M="c"
        )

仅提取部分匹配以下字符串的列:

strings <- c("GRP20R","GRP60R")

如果您的列名都具有可预测的词干长度,则可以使用:

dat[substr(colnames(dat),1,6) %in% strings]

如果您想更灵活地比较第一个句点之前的列名部分.,您可以使用:

dat[gsub("(.)?\\..+","\\1",colnames(dat)) %in% strings]

两个选项都给出结果:

  GRP20R.30.M GRP20R.45.M GRP60R.30.M GRP60R.45.M
1           a           a           c           c
于 2013-07-25T03:13:33.387 回答