Данные подмножества, основанные на частичном совпадении имен столбцов
Мне нужно подмножество df для включения определенных строк. Некоторые из них представляют собой полные имена столбцов, и нижеследующее работает отлично:
testData[,c("FullColName1","FullColName2","FullColName3")]
Моя проблема заключается в том, что мне нужно расширить ее, чтобы также включать имена столбцов, содержащие конкретные строки, которые могут частично соответствовать некоторым другим именам столбцов. Эти строки включают буквы и символы:
"PartString1()","PartString2()"
Я попробовал установить подстановочные знаки. (Я указал это ниже с префиксом "звезда", потому что символ "*" не отображается правильно.)
testData[ ,c("FullColName1","FullColName2","FullColName3",
"starPartString1()star","starPartString2()star")]
Но я получаю сообщение об ошибке: выбраны столбцы undefined. Я не могу понять, нужен ли мне grep для выполнения этой работы.
Ответы
Ответ 1
Вы упомянули, что можете искать символы, поэтому в этом конкретном примере мы можем использовать [[: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
ADD за комментарий OPs
d[grepl("ring[12()]", names(d))]
чтобы получить любую из подстрок ring1()
или ring2()
из вектора имен
Ответ 2
Вы можете использовать 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
проверьте, присутствует ли шаблон в любом месте имени, поэтому шаблон не требуется.