2013-04-23 6 views
5

Ho cercato su Internet e non riesco a capire come applicare car per ricodificare i valori per un intervallo di colonne.Utilizzo di `car` per la ricodifica su un intervallo di colonne

per ricodificare i valori di una singola colonna, mi piacerebbe correre un comando come:

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

E poi se volevo fare questo per tutta la data.frame, ho potuto eseguire:

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

Tuttavia, non sono sicuro di come fare questo per una serie di colonne - per esempio, in un ipotetico data.table chiamato df, come avrei ricodificare i valori per le colonne che vanno da 20:40?

Grazie! Certo, questo è super facile per gli esperti R.

risposta

5

Forse c'è un altro modo data.table per fare questo, ma qui è una possibilità:

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 

Usa .SDcols per definire le colonne che si desidera applicare la funzione.

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

E se voglio usare i nomi delle variabili al posto dei numeri delle colonne? – sdaza

1

Certo che puoi. In realtà facendo solo su un sottoinsieme del data.frame permette di evitare di dover rifare la chiamata data.frame:

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

di farlo col-numero:

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

Grazie! Potresti aggiungere una rapida spiegazione del perché questo non funziona in data.table? Ho dovuto ricontrominciare a data.frame per farlo funzionare e conoscere meglio perché questo è il caso sarebbe fantastico :) – roody

+1

'La sintassi [<-. Data.table' è completamente diversa da' [<-. Data.frame 'sintassi. Non ho notato che data.table era parte della domanda. Se pubblichi un test in futuro otterrai risposte migliori. –

0

Utilizzando i nomi delle variabili al posto dei numeri di colonna sarebbe qualcosa di simile:

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