2014-06-12 8 views
12

È necessario impostare un df per includere determinate stringhe. Alcuni di questi sono i nomi delle colonne piene, e la seguente funziona bene:Dati di sottoinsieme basati sulla corrispondenza parziale dei nomi di colonna

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

Il mio problema è che ho bisogno di espandere questa per includere anche i nomi delle colonne che contengono stringhe specifiche che possono parzialmente corrispondere ad alcuni altri nomi di colonna. Queste stringhe includono lettere e simboli:

"PartString1()","PartString2()" 

Ho provato a mettere dei caratteri jolly intorno a questi. (Ho indicato questo qui sotto con il prefisso "stella", perché il simbolo "*" non rendeva correttamente.)

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

Ma io sto ottenendo un messaggio di errore: colonne indefiniti selezionati. Non riesco a capire se e come ho bisogno di grep per fare questo lavoro.

+1

Che cos'è "PartString1()"? Le parentesi accoppiate mi fanno pensare che stai usando una funzione. NON è un nome R valido. Prova a inserire un codice che costruisca ciò con cui stai lavorando. –

+0

"PartString1()" è un nome di variabile. Stavo cercando di usare grep per corrispondere su nomi di colonne parziali che includevano stringhe di caratteri specifici e una serie di parentesi. Problema risolto con df2 <-df1 [, grepl ("FullColName1 | FullColName2 | FullColName3 | PartSting1 [[: punct:]] | PartString2 [[: punct:]]", nomi (df1))] – user3614783

risposta

10

Hai menzionato che potresti cercare simboli, quindi per questo particolare esempio possiamo usare [[:punct:]] come espressione regolare. Questo troverà tutte le stringhe con simboli di punteggiatura nei nomi delle 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 

Questa ultima parte solo illustra un altro modo per fare questo con le altre funzioni di elaborazione stringa dal stringr

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

ADD al PO commentano

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

per ottenere uno dei due sottostringhe ring1() o ring2() dal vettore nomi

+0

Grazie mille Richard. Non sapevo di [[: punct:]]. Questo quasi risolve il mio problema, ma ho bisogno di selezionare tutte le colonne che hanno la sottostringa ring1() o la sottostringa ring2(). Solo la ricerca della punteggiatura è troppo ampia. – user3614783

+0

Sarebbe solo 'd [, grepl (" ring [12()] ", names (d))]'. Vorresti che lo cambiassi nella mia risposta? –

+0

Mi sono inventato d [, grep ("ring1 [[: punct:]] | ring2 [[: punct:]]", nomi (d))], ma il tuo è più elegante. Grazie ancora. – user3614783

3

È possibile utilizzare grepl per una ricerca per nome colonna. Restituisce un vettore logico che indica le corrispondenze.

Ecco un esempio:

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 di controllo per vedere se il modello è presente in qualsiasi parte del nome, quindi un jolly non è necessaria.

+0

Oppure usa solo patt = " PartString".La nozione di mettere parentesi accoppiate nei nomi delle colonne del dataframe sembra così sbagliata. –

8

È possibile utilizzare grep per trovare gli indici di nomi di colonna con corrispondenza parziale ad un particolare modello

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" 

Supponiamo che il modello che si desidera far corrispondere è "HAM", insieme ad alcuni nomi di colonna fisse (" 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 

è possibile specificare più modelli utilizzando, grep("pattern1 | pattern2 ", colnames(data))

+0

grazie per avermi mostrato il tuo esempio di pattern multipli. Ho inserito ciascuno degli schemi tra virgolette, piuttosto che racchiudere virgolette sull'intera serie di motivi. – user3614783

+0

Nella mia applicazione, ho dovuto scrivere '' grep ("pattern1 | pattern2", colnames (data)) '', * senza * uno spazio su entrambi i lati di '' | '' – PatrickT

Problemi correlati