2015-06-09 1 views
5

У меня есть dataframe datwe с 37 столбцами. Меня интересует преобразование целочисленных значений (1,2,99) в столбцах 23-35 в значения символов («Да», «Нет», «Нет»).Применить CASE КОГДА в инструкции sqldf для управления несколькими столбцами

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 

Я использовал вышеуказанные sqldf заявления для преобразования каждого столбца отдельно. Мне было интересно, есть ли какой-нибудь другой умный способ сделать это, возможно, применить функции?

Если вам нужны какие-либо воспроизводимые данные для построения фрейма данных datwe, я добавлю его здесь. Благодарю.

Edit: Пример datwe

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

В инструкции SQL у вас есть 2 whens - '... WHEN WHEN 1 ...'. Кроме того, почему бы не просто извлечь 'col23 - col35', а затем преобразовать его в символ внутри R? – zx8754

+0

@ zx8754 Спасибо за это, я отредактировал сообщение. Я предполагаю, что 'as.character()' преобразует целочисленные значения в значения символов. Где передать новые значения в качестве аргументов для преобразования? – Prradep

ответ

3

Не знаю, почему вы использовали sqldf см этот пример:

#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: Использование sqldf в для цикла с внешней переменной:

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

Благодарим за решение и преподаем новый способ сделать это. Я буду отмечать его как принятый, услышав другие способы сделать (с 'sqldf'). Думаю, мне нужно будет внести небольшие изменения в ваше решение, чтобы сделать '99' как' NA'. Благодаря ! – Prradep

+0

@Prradep см. В редакторе, добавлено решение 'sqldf'. – zx8754

+0

Спасибо за решение. – Prradep

 Смежные вопросы

  • Нет связанных вопросов^_^