2015-06-09 13 views
5

37 sütun içeren bir veri çerçevem ​​var datwe. 23 - 35 sütunlarındaki tamsayı değerlerini (1,2,99) karakter değerlerine ('Evet', 'Hayır', 'NA') dönüştürmekle ilgileniyorum.Birden çok sütun üzerinde işlem yapmak için sqldf deyiminde CASE Uygula

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 

ayrı ayrı her bir sütun için yukarıdaki sqldf ifadeleri kullanılarak olmuştur. Bunu yapmanın başka bir akıllı yolu olup olmadığını merak ediyordum, belki de işlevleri uyguluyor musunuz?

datwe veri yapıları oluşturmak için herhangi bir tekrarlanabilir veriye ihtiyacınız varsa, onu buraya ekleyeceğim. Teşekkürler.

Düzenleme: Örnek datwe

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

SQL deyiminde 2 beyazlık var - '... NE ZAMAN 1 ...'. Ayrıca, neden sadece 'col23 - col35' ayıklamak değil, sonra R içindeki karaktere dönüştürmek? – zx8754

+0

@ zx8754 Bunun için gönderiyi düzenledim. As.character() 'ın tamsayı değerlerini karakter değerlerine dönüştüreceğini varsayalım. Yeni değerleri dönüştürülecek argüman olarak nereye aktarabilirim? – Prradep

cevap

3

Eğer sqldf kullanılan neden bu örneğe bakın emin değil:

#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> 

DÜZENLEME: harici değişken ile döngü için içinde sqldf kullanma:

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

Çözüm için teşekkürler ve bunu yapmanın yeni yolu. Bunu yapmanın başka yollarını duyduktan sonra kabul edildiği gibi işaretleyeceğim ('sqldf' ile). Sanırım "99" yi "NA" yapmak için çözümünüze küçük bir değişiklik eklemem gerekecek. Teşekkürler ! – Prradep

+0

@Prradep bkz. "Sqldf" çözümü eklendi. – zx8754

+0

Çözüm için teşekkürler. – Prradep

İlgili konular