2016-05-09 17 views
1

Ich kann keine Antwort auf diese spezifische Frage finden. Ich möchte mehrere Zeichenspalten in numerische Spalten umwandeln. (Es hundert Spalten ist) Aber:Recode Bereich mehrere Spalten in r

  • Spalten werden nicht immer in der gleichen Reihenfolge (I recodieren die aktualisierten Daten jeden Monat).
  • Spalten sind durch Spalten getrennt, die ich nicht rekodieren möchte.
  • Das Dataset enthält nicht immer dieselben Spalten.

Also, ich glaube nicht, dass ich eine Reihe von Spaltenindizes verwenden kann. Die Spalten, die ich umcodieren möchte, beginnen jedoch mit dem gleichen Spaltennamen-Präfix. Ich würde gerne "Ja" zu 1, "Nein" zu 0 und Leerzeichen zu NA umkodieren.

Ich konnte mit dem folgenden Code zu einer Zeit, diese manuell eine Spalte tun:

#Recode columns one at a time 

    library(car) 
    #skip ID column 
    #Skip Date column 
    df$Q1<-as.numeric(as.character(recode(df$Q1,"NA=NA; 'No'=0; 'Yes'=1; ''=NA"))) 
    df$Q2<-as.numeric(as.character(recode(df$Q2,"NA=NA; 'No'=0; 'Yes'=1; ''=NA"))) 
    #skip Q2.Explanation column 
    #do the above for a hundred more columns... 

Aber ich mag hundert, bestimmte Spalten zugleich neu zu kodieren. Auch diese Spalten sind durch Spalten getrennt, die ich nicht rekodieren möchte.

Meine Daten sind unten. Nicht sicher, was ist dput:

ID<-c(01,02,03,04,05) 
    Q1<-c("Yes", NA,"", "No",NA) 
    Q1.Explanation<-c (NA, NA,"","Respondent did not get the correct answer", NA) 
    Q2<-c("No","Yes","Yes","", NA) 
    Q2.Explanation <-c("The right answer was not proven", NA, NA, NA, NA) 
    Q3<-c("", NA, "Yes", NA, NA) 
    Mydata<-as.data.frame(cbind(ID,Q1,Q1.Explanation, Q2, Q2.Explanation,Q3)) 
+0

Sie können die Funktion 'grepl()' zusammen mit dem 'Präfix' verwenden aus den Spalten, die Sie rekodieren möchten, und durchlaufen Sie dann die Spalten für die Neucodierung. Wenn Sie eine spezifischere Antwort wünschen, geben Sie bitte ein Beispiel für Ihren data.frame an, indem Sie das 'dput' Ihrer Daten einfügen. – Psidom

+0

Ist die Rekodierlogik für alle Spalten, die Sie umcodieren wollen, immer gleich (mit anderen Worten: Verwendet die Übersetzung immer dieselbe Mapping-Logik)? –

+0

Ja, die Rekodierlogik ist immer gleich. – Mary

Antwort

2

Wenn Sie wissen, dass die Spalten Sie die gleichen Namen haben immer ändern wollen, nur verschiedene Positionen in der Tabelle, dann können Sie regex auf die Spaltennamen verwenden, um Teilmenge, dann ändern die Werte in den Spalten mit apply().

Dies sollte alle Ihre Spalten, die mit "Q" beginnen, unabhängig von ihrem Standort jeden Monat neu codieren.

+0

Danke für Ihre Hilfe! Ich bin neu in R. Soll ich den Teil deines Codes ersetzen, der "function (x) recode (x)" sagt? Ich bekomme einen Fehler in diesem Teil. – Mary

+0

Ich denke, Sie müssen ersetzen "your_data" mit dem Namen Ihrer data.frame Variable passen Sie den Spaltennamen Teil ("Q") mit dem Teilstring die Filter Ihre Spaltennamen (deren Werte sollen umcodiert werden) –

+0

Wenn Sie einige teilen Ihre Daten mit 'dput()' und teilen Sie den Fehler, ich könnte in der Lage sein, damit zu helfen.Ansonsten kann ich nur von dem was du gepostet hast ausgehen. –

1

Für data.table Fans habe ich eine andere Lösung, die auch den Vorteil hat, die Verwendung von factors anstelle von numerischen Zahlen für die Umkodierung so dass die Bedeutung der numerischen Werte immer noch korrekt angezeigt wird (die Lesbarkeit der Daten zu verbessern):

library(data.table) 

ID<-c(01,02,03,04,05) 
Q1<-c("Yes", NA,"", "No",NA) 
Q1.Explanation<-c (NA, NA,"","Respondent did not get the correct answer", NA) 
Q2<-c("No","Yes","Yes","", NA) 
Q2.Explanation <-c("The right answer was not proven", NA, NA, NA, NA) 
Q3<-c("", NA, "Yes", NA, NA) 
Mydata<-as.data.frame(cbind(ID,Q1,Q1.Explanation, Q2, Q2.Explanation,Q3)) 

Mydata 

# The solution starts here... ---------------------------------------------- 

setDT(Mydata)  # convert data.frame into data.table 

# the regular expression selects all column names starting with a "Q" followed by digits until the end 
affected.cols <- colnames(Mydata)[grep("^Q\\d+$", colnames(Mydata))] 

# convert the columns to factors; trailing square brackets are only added to print the output 
Mydata[, (affected.cols) := lapply(affected.cols, function(x) { .SD[, factor(get(x), c("No", "Yes")) ] })] [] 

str(Mydata)   # Columns are encoded as factors ("enumerated types") now, which is an integer internally that has a string label 

# Proof: 1 = "No", 2 = "Yes"; the "excluded" parameter of "factor()" caused all other values (mainly empty strings) to be translated into NAs 
as.numeric(Mydata$Q1) 

was zur Folge hat:

> as.numeric(Mydata$Q1) 
[1] 2 NA NA 1 NA 


> Mydata 
    ID Q1       Q1.Explanation Q2     Q2.Explanation Q3 
1: 1 Yes          NA No The right answer was not proven NA 
2: 2 NA          NA Yes        NA NA 
3: 3 NA           Yes        NA Yes 
4: 4 No Respondent did not get the correct answer NA        NA NA 
5: 5 NA          NA NA        NA NA 

Die korrekte Übersetzung der numerischen Werte ist aufgrund glücklicher Umstand, dass die angeforderten numerischen Werte mit 1 beginnen, so dass das "Nein" den Level-Index 1 und "Yes" den Level-Index 2 hat.