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.
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
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))
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.