基于列名称的部分匹配的子集数据

时间:2014-06-12 04:29:38

标签: r subset

我需要将df子集以包含某些字符串。其中一些是完整的列名,以下工作正常:

testData[,c("FullColName1","FullColName2","FullColName3")]

我的问题是我需要扩展它以包含包含可能与其他列名称部分匹配的特定字符串的列名。这些字符串包括字母和符号:

"PartString1()","PartString2()"

我尝试在这些周围加上通配符。 (我在下面用前缀“star”表示,因为“*”符号没有正确呈现。)

testData[ ,c("FullColName1","FullColName2","FullColName3",
             "starPartString1()star","starPartString2()star")]

但是我收到一条错误消息:选中了未定义的列。我无法弄清楚我是否需​​要grep来完成这项工作。

3 个答案:

答案 0 :(得分:15)

您提到过您可能正在寻找符号,因此对于此特定示例,我们可以使用[[:punct:]]作为正则表达式。这将在列名中找到带标点符号的所有字符串。

d <- data.frame(1:3, 3:1, 11:13, 13:11, rep(1, 3))
names(d) <- c("FullColName1", "FullColName2", "FullColName3",
              "PartString1()","PartString2()")

d[grepl("[[:punct:]]", names(d))]
#   PartString1() PartString2()
# 1            13             1
# 2            12             1
# 3            11             1

这最后一部分仅说明了使用stringr

中的其他字符串处理函数执行此操作的另一种方法
library(stringr)
d[str_detect(names(d), "[[:punct:]]")]
#   PartString1() PartString2()
# 1            13             1
# 2            12             1
# 3            11             1
每个OP评论

ADD

d[grepl("ring[12()]", names(d))]

从名称向量中获取子字符串ring1()ring2()

答案 1 :(得分:9)

您可以使用grep查找与特定模式部分匹配的列名索引

require(PerformanceAnalytics)
data(managers)

colnames(managers)
#[1] "HAM1"        "HAM2"        "HAM3"        "HAM4"        "HAM5"       
#[6] "HAM6"        "EDHEC LS EQ" "SP500 TR"    "US 10Y TR"   "US 3m TR"

假设您要匹配的模式是&#34; HAM &#34;以及一些固定的列名称(&#34; SP500 TR&#34;&#34; US 10Y TR&#34;&#34; US 3m TR&#34;)

head(managers[,c("SP500 TR","US 10Y TR","US 3m TR",colnames(managers)[grep("HAM",colnames(managers))])])
#           SP500 TR US 10Y TR US 3m TR    HAM1 HAM2    HAM3    HAM4 HAM5 HAM6
#1996-01-31   0.0340   0.00380  0.00456  0.0074   NA  0.0349  0.0222   NA   NA
#1996-02-29   0.0093  -0.03532  0.00398  0.0193   NA  0.0351  0.0195   NA   NA
#1996-03-31   0.0096  -0.01057  0.00371  0.0155   NA  0.0258 -0.0098   NA   NA
#1996-04-30   0.0147  -0.01739  0.00428 -0.0091   NA  0.0449  0.0236   NA   NA
#1996-05-31   0.0258  -0.00543  0.00443  0.0076   NA  0.0353  0.0028   NA   NA
#1996-06-30   0.0038   0.01507  0.00412 -0.0039   NA -0.0303 -0.0019   NA   NA

您可以使用grep("pattern1 | pattern2 ", colnames(data))

指定多个模式

答案 2 :(得分:3)

您可以使用grepl按列名进行搜索。它返回一个表示匹配的逻辑向量。

以下是一个例子:

d <- read.table(header=TRUE, check.names=FALSE,
                text="1PartString()2 1PartString()3 OtherCol
                1 2 3
                3 4 5")
d
##   1PartString()2 1PartString()3 OtherCol
## 1              1              2        3
## 2              3              4        5

d[,grepl("PartString\\(\\)", names(d))]
##   1PartString()2 1PartString()3
## 1              1              2
## 2              3              4

grepl检查模式是否存在于名称中的任何位置,因此不需要通配符。