2013-04-23 4 views
5

Ich habe über im Internet stochern und kann nicht herausfinden, wie car anwenden, um Werte für eine Reihe von Spalten zu recode.Mit `Auto` zu recode über den Bereich von Spalten

Um Werte für eine einzelne Spalte neu codieren, ich einen Befehl ausführen würde wie:

df$dv_r <- recode(df$dv, "2=1;1=0;0=NA") 

Und dann, wenn ich dies für die ganze data.frame tun wollte, konnte ich laufen:

df_2 <- lapply(df, FUN = function(x) recode(x, "2=1;1=0;0=NA")) 

aber ich bin nicht sicher, wie dies von Spalten für einen Bereich zu tun - zum Beispiel in einem hypothetischen data.tabledf genannt, wie würde ich Werte für Spalten Umkodierung von 20:40 hin?

Danke! Sicher, das ist super einfach für R-Experten.

Antwort

5

Vielleicht gibt es eine mehr data.table Weg, dies zu tun, aber hier ist eine Möglichkeit:

library(data.table) 
library(car) 

## Here is some sample data 
set.seed(1) 
dt <- data.table(A = sample(0:2, 10, replace = TRUE), 
       B = sample(0:2, 10, replace = TRUE), 
       C = sample(0:2, 10, replace = TRUE), 
       D = rnorm(10), E = rnorm(10), ID = 1:10) 
dt 
#  A B C   D   E ID 
# 1: 0 0 2 -0.04493361 -0.05612874 1 
# 2: 1 0 0 -0.01619026 -0.15579551 2 
# 3: 1 2 1 0.94383621 -1.47075238 3 
# 4: 2 1 0 0.82122120 -0.47815006 4 
# 5: 0 2 0 0.59390132 0.41794156 5 
# 6: 2 1 1 0.91897737 1.35867955 6 
# 7: 2 2 0 0.78213630 -0.10278773 7 
# 8: 1 2 1 0.07456498 0.38767161 8 
# 9: 1 1 2 -1.98935170 -0.05380504 9 
# 10: 0 2 1 0.61982575 -1.37705956 10 

Verwenden .SDcols zu definieren, welche Spalten Sie die Funktion anwenden möchten.

dt[, 1:3 := lapply(.SD, recode, "2=1;1=0;0=NA"), .SDcols = 1:3] 
dt 
#  A B C   D   E ID 
# 1: NA NA 1 -0.04493361 -0.05612874 1 
# 2: 0 NA NA -0.01619026 -0.15579551 2 
# 3: 0 1 0 0.94383621 -1.47075238 3 
# 4: 1 0 NA 0.82122120 -0.47815006 4 
# 5: NA 1 NA 0.59390132 0.41794156 5 
# 6: 1 0 0 0.91897737 1.35867955 6 
# 7: 1 1 NA 0.78213630 -0.10278773 7 
# 8: 0 1 0 0.07456498 0.38767161 8 
# 9: 0 0 1 -1.98935170 -0.05380504 9 
# 10: NA 1 0 0.61982575 -1.37705956 10 
+0

Und wenn ich Variablennamen anstelle von Spaltennummern verwenden möchte? – sdaza

1

Sicher kannst du. In der Tat auf einer Teilmenge der data.frame nur tun, können Sie vermeiden, dass der data.frame Anruf wiederholen:

df_2[ , col_names] <- lapply(df[ ,colnames] , 
           FUN = function(x) recode(x, "2=1;1=0;0=NA")) 

Of tut es durch col-Nummer:

df_2[ , 20:40] <- lapply(df[ ,20:40] , 
           FUN = function(x) recode(x, "2=1;1=0;0=NA")) 
+0

Dank! Können Sie eine kurze Erklärung hinzufügen, warum dies in data.table nicht funktioniert? Ich musste zu data.frame zurückkonvertieren, um es zu arbeiten, und weiteres Wissen, warum das der Fall ist, wäre genial :) – roody

+1

'[<-. Data.table'Syntax ist völlig anders als' [<-. Data.frame 'Syntax. Ich habe nicht bemerkt, dass data.table Teil der Frage war. Wenn Sie in Zukunft einen Testfall veröffentlichen, erhalten Sie bessere Antworten. –

0

Mit Variablennamen würde statt Spaltennummern wie etwas sein:

cnames <- c("A", "B", "C")  
dt[ , cnames := lapply(dt[,cnames,with=FALSE], 
recode, "2=1;1=0;0=NA"), with=FALSE] 
Verwandte Themen