2016-05-26 12 views
0

Ich habe einen Datenrahmen mit Spaltennamen zu ignorieren, die wie folgt aussehen:Strings Suche nach mehreren Übereinstimmungen

d=c("Q.40a-some Text", "Q.40b-some Text", "Q.44a-some Text", "Q.44b-some Text" "Q.44c-some Text" "Q.44d-some Text" ,"Q.4a-some Text", "Q.4b-some Text") 

Ich möchte die Spalten identifizieren, die mit Q.4 beginnen und die Q.40 zu ignorieren, Q. 44.

Zum Beispiel Q.44 oder Q.40 zu identifizieren, ist einfach. Was ich tue ist, diese "^Q.44" oder "^ Q.40" als Eingabe für meine Funktion zu verwenden. Aber das funktioniert nicht, wenn ich dasselbe für die Identifizierung von Q.4 tue - einfach weil alle Namen mit Q.4 beginnen. Kann mir also jemand dabei helfen?

UPDATE

Das Ergebnis, das ich es übergeben wollen, um meine Funktion, die Eingänge wie folgt nimmt:

multichoice<-function(data, question.prefix){ 

    index<-grep(question.prefix, names(data)) # identifies the index for the available options in Q.12 
    cases<-length(index)    # The number of possible options/columns 

    # Identify the range of possible answers for each question 
    # Step 1. Search for the min in each col and across each col choose the min 
    # step 2. Search for the max in each col and across each col choose the max 

    mn<-min(data[,index[1:cases]], na.rm=T) 
    mx<-max(data[,index[1:cases]], na.rm=T) 
    d = colSums(data[, index] != 0, na.rm = TRUE) # The number of elements across column vector, that are different from zero. 

    vec<-matrix(,nrow=length(mn:mx),ncol=cases) 

    for(j in 1:cases){ 
    for(i in mn:mx){ 
     vec[i,j]=sum(data[, index[j]] == i, na.rm = TRUE)/d[j] # This stores the relative responses for option j for the answer that is i 
    } 
    } 

    vec1<-as.data.frame(vec) 
    names(vec1)<-names(data[index]) 
    vec1<-t(vec1) 
    return(vec1) 
} 

Und die Art, wie ich meine funtion verwenden ist diese

q4 <-multichoice(df2,"^Q.4") 

Mit "^ Q.4" beabsichtige ich die Spalten für Q.4 zu identifizieren, und df2 ist mein Datenframe.

Antwort

1

Hier ein Verfahren grep mit: zurückzukehren, um die Indizes

grep("^Q\\.4[^0-9]", d) 

Von den Spaltennamen:

grep("^Q\\.4[^0-9]", d, value=T) 

Dies funktioniert, weil [^ 0-9] sagt jedes Zeichen, das keine Zahl ist, so dass wir übereinstimmen Q.4 wahrsten Sinne des Wortes, dann mit jeder nicht Zahlenketten entsprechen.

Ich glaube, was Sie in der mn-Anweisung in der Funktion wollen, ist

mn <- min(sapply(data[,index], min, na.rm=T), na.rm=T) 

sapply bewegt sich durch die durch den Index ausgewählten Spalten ausgewählt grep und findet das Minimum mit min. Dann wird min auf alle Spalten angewendet.

+0

Danke Imo, das ist cool. Ich habe ein bisschen Probleme mit regulären Ausdrücken und die Dokumentation ist wirklich schlecht für einen Anfänger wie mich. Kannst du mir bitte helfen, wie ich deine Methode nutze, um das Ergebnis an meine Funktion zu übergeben? Ich habe meine Frage entsprechend bearbeitet, um zu sehen, was meine Funktion als Eingabe benötigt. – msh855

+0

Meine Lieblingsregex-Site ist [hier] (http://www.regular-expressions.info/). Sie haben viele tolle Infos. Was Sie jetzt fragen, sollte in einer neuen Frage gestellt werden, aber ich werde einen Blick darauf werfen. – lmo

+0

Ich aktualisierte meine Antwort, um eine Methode zur Berechnung des Minimums zu geben. Wenn Sie mehr benötigen, sollten Sie eine neue Frage stellen, die auch einige Beispieldaten (mit "dput") enthält, mit denen Personen ihre Lösungen testen können. – lmo

1

Wir verwenden stringr,

library(stringr) 
str_extract(d, 'Q.[0-9]+') == 'Q.4' 
#[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE 

#or 

d[str_extract(d, 'Q.[0-9]+') == 'Q.4'] 
#[1] "Q.4a-some Text" "Q.4b-some Text" 

Wenn das Format immer das gleiche ist (dh F: [0-9] ...), dann können wir verwenden gsub

gsub('\\D', '', d) == 4 
#[1] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE 
+0

Danke, patriwti. Kannst du bitte meinen Kommentar zu Imo lesen? – msh855

Verwandte Themen