web-dev-qa-db-fra.com

Données de sous-ensemble basées sur une correspondance partielle des noms de colonne

J'ai besoin de sous-définir un df pour inclure certaines chaînes. Certains d'entre eux sont des noms de colonne complets et les éléments suivants fonctionnent correctement:

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

Mon problème est que je dois développer cela pour inclure également les noms de colonnes qui contiennent des chaînes spécifiques qui peuvent correspondre partiellement à certains autres noms de colonnes. Ces chaînes comprennent des lettres et des symboles:

"PartString1()","PartString2()"

J'ai essayé de placer des caractères génériques autour de ceux-ci. (Je l'ai indiqué ci-dessous avec le préfixe "star" car le symbole "*" ne s'est pas rendu correctement.)

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

Mais je reçois un message d'erreur: des colonnes non définies sont sélectionnées. Je ne peux pas comprendre si ou comment j'ai besoin de grep pour que cela fonctionne.

17
user3614783

Vous avez mentionné que vous recherchiez peut-être des symboles, donc pour cet exemple particulier, nous pouvons utiliser [[:punct:]] Comme expression régulière. Cela trouvera toutes les chaînes avec des symboles de ponctuation dans les noms de colonne.

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

Cette dernière partie illustre simplement une autre façon de le faire avec d'autres fonctions de traitement de chaînes de stringr

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

AJOUTEZ par commentaire OP

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

pour obtenir l'une des sous-chaînes ring1() ou ring2() du vecteur de noms

15
Rich Scriven

Vous pouvez utiliser grep pour trouver des indices de noms de colonnes avec une correspondance partielle avec un modèle particulier

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"

supposons que le modèle que vous souhaitez faire correspondre soit " HAM ", ainsi que certains noms de colonnes fixes ("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

vous pouvez spécifier plusieurs modèles en utilisant, grep("pattern1 | pattern2 ", colnames(data))

9
Silence Dogood

Vous pouvez utiliser grepl pour une recherche par nom de colonne. Il renvoie un vecteur logique indiquant les correspondances.

Voici un exemple:

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 vérifiez si le modèle est présent n'importe où dans le nom, donc un caractère générique n'est pas requis.

3
Matthew Lundberg