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

use*_*783 17 r subset

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

testData[,c("FullColName1","FullColName2","FullColName3")]
Run Code Online (Sandbox Code Playgroud)

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

"PartString1()","PartString2()"
Run Code Online (Sandbox Code Playgroud)

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

testData[ ,c("FullColName1","FullColName2","FullColName3",
             "starPartString1()star","starPartString2()star")]
Run Code Online (Sandbox Code Playgroud)

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

Ric*_*ven 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
Run Code Online (Sandbox Code Playgroud)

最后一部分仅说明了使用其他字符串处理函数执行此操作的另一种方法 stringr

library(stringr)
d[str_detect(names(d), "[[:punct:]]")]
#   PartString1() PartString2()
# 1            13             1
# 2            12             1
# 3            11             1
Run Code Online (Sandbox Code Playgroud)

添加每个OP评论

d[grepl("ring[12()]", names(d))]
Run Code Online (Sandbox Code Playgroud)

获取子字符串中的任何一个ring1()ring2()从名称向量中获取


Sil*_*ood 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"
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

您可以使用指定多个模式, grep("pattern1 | pattern2 ", colnames(data))