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

问题描述 投票:0回答:4

我需要对 df 进行子集化以包含某些字符串。其中一些是完整的列名称,以下效果很好:

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

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

"PartString1()","PartString2()"

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

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

但我收到一条错误消息:选择了未定义的列。我不知道是否或如何需要 grep 来完成这项工作。

r subset
4个回答
17
投票

您提到您可能正在寻找符号,因此对于这个特定的示例,我们可以使用

[[: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评论

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

从名称向量中获取子字符串

ring1()
ring2()


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"

假设您要匹配的模式是“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

您可以使用指定多个模式,

grep("pattern1 | pattern2 ", colnames(data))


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
检查该模式是否存在于名称中的任何位置,因此不需要通配符。


0
投票

提出的问题是如何在仅给出部分字符串的情况下检索特定的列名称。让我提供一个简单的

grepl
解决方案。

#example data
 df <- data.frame(col1_sse = paste0(1:5, LETTERS[1:5]),
            col2_swl = runif(5, max = 10), 
            col3_sdz = runif(5, max = 1000),
            col4_swl = paste0(letters[1:5]))

#assume partial names are complex
 partial_names <- c("2_sw", "sdz")

#create a "keepers" list of column names
 keepers <- names(df)[grepl(paste0(partial_names, collapse = "|"), names(df))]

#use "keepers" to extract cols from original data 
 new_df <- df[,keepers]
© www.soinside.com 2019 - 2024. All rights reserved.