2015-06-09 16 views
5

Ho un dataframe datwe con 37 colonne. Sono interessato a convertire i valori interi (1,2,99) nelle colonne da 23 a 35 ai valori dei caratteri ("Sì", "No", "NA").Applica CASO QUANDO nella dichiarazione sqldf per la manipolazione di più colonne

datwe$COL23 <- sqldf("SELECT CASE COL23 WHEN 1 THEN 'Yes' 
             WHEN 2 THEN 'No' 
             WHEN 99 THEN 'NA' 
            ELSE 'Name ittt' 
           END as newCol 
           FROM datwe")$newCol 

Ho utilizzato le precedenti istruzioni sqldf per convertire ciascuna colonna separatamente. Mi stavo chiedendo se c'è qualche altro modo intelligente per farlo, forse applicare le funzioni?

Se sono necessari dati riproducibili per la costruzione del dataframe datwe, lo aggiungerò qui. Grazie.

Edit: Esempio datwe

set.seed(12) 
data.frame(replicate(37,sample(c(1,2,99),10,rep=TRUE))) 
+0

Nella dichiarazione SQL ci sono 2 perni - '... WHEN WHEN 1 ...'. Inoltre, perché non estrarre semplicemente 'col23 - col35', quindi convertirlo in carattere in R? – zx8754

+0

@ zx8754 Grazie per quello, ho modificato il post. Suppongo che 'as.character()' converta i valori interi in valori di carattere. Dove dovrei passare i nuovi valori come argomenti da convertire? – Prradep

risposta

3

Non certo perché si è utilizzato sqldf, vedere questo esempio:

#dummy data 
set.seed(12) 
datwe <- data.frame(replicate(37,sample(c(1,2,99),10,rep=TRUE))) 

#convert to Yes/No 
res <- as.data.frame(
    sapply(datwe[,23:37], function(i) 
    ifelse(i==1, "Yes", 
      ifelse(i==2, "No", 
        ifelse(i==99,NA,"Name itttt"))))) 

#update dataframe 
datwe <- cbind(datwe[, 1:22],res) 

#output, just showing first 2 columns 
datwe[,23:24] 
#  X23 X24 
# 1 No Yes 
# 2 Yes Yes 
# 3 Yes No 
# 4 No No 
# 5 Yes No 
# 6 Yes Yes 
# 7 <NA> No 
# 8 No No 
# 9 Yes <NA> 
#10 No <NA> 

EDIT: Utilizzando sqldf all'interno di un ciclo for con una variabile esterna:

library(sqldf) 

#dummy data 
set.seed(12) 
datwe <- data.frame(replicate(37,sample(c(1,2,99),10,rep=TRUE))) 

#sqldf within a loop 
for(myCol in paste0("X",23:37)) 
    datwe[,myCol] <- 
    fn$sqldf("SELECT CASE $myCol 
        WHEN 1 THEN 'Yes' 
        WHEN 2 THEN 'No' 
        WHEN 99 THEN 'NA' 
        ELSE 'Name ittt' 
        END as newCol 
      FROM datwe")$newCol 

#check output, showing only 2 columns 
datwe[,23:24] 
# X23 X24 
# 1 No Yes 
# 2 Yes Yes 
# 3 Yes No 
# 4 No No 
# 5 Yes No 
# 6 Yes Yes 
# 7 NA No 
# 8 No No 
# 9 Yes NA 
# 10 No NA 
+0

Grazie per la soluzione e l'insegnamento di un nuovo modo di farlo. Lo contrassegnerò come accettato dopo aver ascoltato altri modi per farlo (con 'sqldf'). Credo che avrei bisogno di incorporare piccoli cambiamenti nella soluzione per rendere '99' come' NA'. Grazie ! – Prradep

+0

@Prospep vedi modifica, aggiunta soluzione 'sqldf'. – zx8754

+0

Grazie per la soluzione. – Prradep