2015-06-09 3 views
5

Ich habe einen Datenrahmen datwe mit 37 Spalten. Ich möchte die ganzzahligen Werte (1,2,99) in den Spalten 23 bis 35 in Zeichenwerte umwandeln ('Ja', 'Nein', 'NA').Apply CASE WHEN in sqldf Anweisung für die Manipulation mehrerer Spalten

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 

ich gewesen, die oben sqldf-Anweisungen jede Spalte separat zu konvertieren. Ich habe mich gefragt, ob es eine andere schlaue Art gibt, dies zu tun, vielleicht Funktionen anzuwenden?

Wenn Sie irgendwelche reproduzierbaren Daten für den Aufbau von Datenrahmen datwe benötigen, werde ich es hier hinzufügen. Vielen Dank.

Edit: Beispiel datwe

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

In SQL-Anweisung haben Sie 2 When - '... WANN WENN 1 ...'. Warum nicht einfach "col23 - col35" extrahieren und dann in ein Zeichen in R umwandeln? – zx8754

+0

@ zx8754 Danke dafür, ich habe den Beitrag bearbeitet. Ich nehme an, dass das 'as.character()' die Integer-Werte in Zeichenwerte umwandelt. Wohin soll ich die neuen Werte als Argumente übergeben? – Prradep

Antwort

3

nicht sicher, warum Sie sqldf verwendet, um dieses Beispiel zu sehen:

#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: Mit sqldf innerhalb einer for-Schleife mit einer externen Variablen:

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

Danke für die Lösung und das Lehren neuer Art, es zu tun. Ich werde es als akzeptiert markieren, nachdem ich einige andere Arten zu tun gehört habe (mit 'sqldf'). Ich denke, ich müsste kleine Änderungen in Ihre Lösung einbauen, um "99" zu "NA" zu machen. Vielen Dank ! – Prradep

+0

@ Prradep siehe bearbeiten, hinzugefügt 'sqldf' Lösung. – zx8754

+0

Danke für die Lösung. – Prradep