2015-06-09 36 views
5

我有一个数据框datwe,有37列。我有兴趣将第23列至第35列中的整数值(1,2,99)转换为字符值('是','否','NA')。在sqldf语句中应用CASE WHEN操作多列

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

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

在SQL语句中,你有2个 - '...当... 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> 

编辑: 使用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