Подтвердить что ты не робот

Данные подмножества, основанные на частичном совпадении имен столбцов

Мне нужно подмножество df для включения определенных строк. Некоторые из них представляют собой полные имена столбцов, и нижеследующее работает отлично:

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

Моя проблема заключается в том, что мне нужно расширить ее, чтобы также включать имена столбцов, содержащие конкретные строки, которые могут частично соответствовать некоторым другим именам столбцов. Эти строки включают буквы и символы:

"PartString1()","PartString2()"

Я попробовал установить подстановочные знаки. (Я указал это ниже с префиксом "звезда", потому что символ "*" не отображается правильно.)

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

Но я получаю сообщение об ошибке: выбраны столбцы undefined. Я не могу понять, нужен ли мне grep для выполнения этой работы.

4b9b3361

Ответ 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 проверьте, присутствует ли шаблон в любом месте имени, поэтому шаблон не требуется.