在sqldf语句中应用CASE WHEN来操作多个列

Prr*_*dep 6 r apply dataframe sqldf

我有一个datwe37列的数据框.我有兴趣将第23到35列中的整数值(1,2,99)转换为字符值('是','否','NA').

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
Run Code Online (Sandbox Code Playgroud)

我一直在使用上面的sqldf语句分别转换每一列.我想知道是否有其他智能方法可以做到这一点,也许应用功能?

如果您需要任何可重现的数据来构建数据帧datwe,我将在此处添加它.谢谢.

编辑:示例 datwe

set.seed(12)
data.frame(replicate(37,sample(c(1,2,99),10,rep=TRUE)))
Run Code Online (Sandbox Code Playgroud)

zx8*_*754 5

不确定您使用的原因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>
Run Code Online (Sandbox Code Playgroud)

编辑: 使用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
Run Code Online (Sandbox Code Playgroud)