我有一个数据框和一个向量。该向量有大约 20 个字符串值,它们对应于数据框中的部分列名。数据框有数百个列名。我必须根据向量中存在的部分列名对数据框进行子集化。
例如,如果数据框中的列名称之一是 GRP20R.45.M,则向量中的值之一将是 GRP20R
谢谢
我有一个数据框和一个向量。该向量有大约 20 个字符串值,它们对应于数据框中的部分列名。数据框有数百个列名。我必须根据向量中存在的部分列名对数据框进行子集化。
例如,如果数据框中的列名称之一是 GRP20R.45.M,则向量中的值之一将是 GRP20R
谢谢
假设这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))]
测试数据:
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