2015-06-09 15 views
5

Tôi có một khung dữ liệu datwe với 37 cột. Tôi quan tâm đến việc chuyển đổi các giá trị số nguyên (1,2,99) trong các cột từ 23 đến 35 thành các giá trị ký tự ('Có', 'Không', 'NA').Áp dụng CASE KHI trong câu lệnh sqldf để thao tác nhiều cột

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 

Tôi đã sử dụng các câu lệnh trên sqldf để chuyển đổi riêng từng cột. Tôi đã tự hỏi nếu có bất kỳ cách thông minh khác để làm điều này, có lẽ áp dụng các chức năng?

Nếu bạn yêu cầu bất kỳ dữ liệu tái tạo nào để xây dựng khung dữ liệu datwe, tôi sẽ thêm nó tại đây. Cảm ơn.

Edit: Ví dụ datwe

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

Trong câu lệnh SQL bạn có 2 whens - '... WHEN WHEN 1 ...'. Ngoài ra, tại sao không chỉ trích xuất 'col23 - col35', sau đó chuyển đổi nó thành ký tự trong R? – zx8754

+0

@ zx8754 Cảm ơn vì điều đó, tôi đã chỉnh sửa bài đăng. Tôi giả định rằng 'as.character()' sẽ chuyển đổi các giá trị số nguyên thành các giá trị ký tự. Tôi nên chuyển các giá trị mới làm đối số để chuyển đổi ở đâu? – Prradep

Trả lời

3

Không chắc lý do tại sao bạn sử dụng sqldf, xem ví dụ sau:

#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: Sử dụng sqldf trong một vòng lặp for với một biến bên ngoài:

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

Cảm ơn bạn đã giải pháp và giảng dạy cách làm mới. Tôi sẽ đánh dấu nó như được chấp nhận sau khi nghe một số cách khác để làm (với 'sqldf'). Tôi đoán tôi sẽ cần phải kết hợp thay đổi nhỏ trong giải pháp của bạn để làm cho '99' là' NA'. Cảm ơn ! – Prradep

+0

@Prradep xem chỉnh sửa, thêm giải pháp 'sqldf'. – zx8754

+0

Cảm ơn bạn đã giải pháp. – Prradep

Các vấn đề liên quan