我需要对 df 进行子集化以包含某些字符串。其中一些是完整的列名称,以下效果很好:
testData[,c("FullColName1","FullColName2","FullColName3")]
我的问题是,我需要扩展它以还包括包含可能与某些其他列名称部分匹配的特定字符串的列名称。这些字符串包括字母和符号:
"PartString1()","PartString2()"
我尝试在这些周围放置通配符。 (我在下面用前缀“star”表示这一点,因为“*”符号没有正确呈现。)
testData[ ,c("FullColName1","FullColName2","FullColName3",
"starPartString1()star","starPartString2()star")]
但我收到一条错误消息:选择了未定义的列。我不知道是否或如何需要 grep 来完成这项工作。
您提到您可能正在寻找符号,因此对于这个特定的示例,我们可以使用
[[: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()
您可以使用
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))
您可以使用
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
检查该模式是否存在于名称中的任何位置,因此不需要通配符。
提出的问题是如何在仅给出部分字符串的情况下检索特定的列名称。让我提供一个简单的
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]