在 R 中有效地将多个变量从字符重新编码为数值

Efficiently recoding multiple variables from character to numeric values in R

我正在使用 R(版本 3.2.3)从字符值("High"、"Medium"、"Low" 和 [=18)重新编码多个变量(在同一数据帧中) =]) 到数值(4、3、2 和 1)。我知道有几种方法可以重新编码一个变量,在我下面的例子中,我一直在使用 car 包中的 "recode" 函数。这在重新编码单个变量时工作正常,但当我指定多个变量(第 45 至 68 列)时,所有值都被替换为 "N/A"。

df[,c(45:68)] <- recode(df[,c(45:68)],"'High'=4;'Medium'=3;'Low'=2;'No Concerns'=1",as.numeric.result=TRUE)

如果您能给我指点,我将不胜感激。我是编码社区的新手,所以如果我在我的问题中提供了足够的细节,请告诉我。

尝试以下操作:

df[,c(45:68)] <- lapply(df[,c(45:68)], function(x) 
                 recode(x,"'High'=4;
                           'Medium'=3;
                           'Low'=2;
                           'No Concerns'=1",
                            as.numeric.result=TRUE))

这里发生的是您将单独的列传递给 recode。查看 recode 的帮助文件,您会发现该函数需要一个数值向量、字符向量或一个因子作为输入。但是,在您的代码中,您提供了一个列表。上面的代码提供了单独的列来重新编码,这应该可以工作。当然,没有合适的示例数据,很难说,但试试看。

使用 dplyrhablar 的解决方案:

library(dplyr)
library(hablar)

df <- df %>% 
  mutate_at(vars(45:68),
            funs(case_when(x == 'High'        ~ 4,
                           x == 'Medium'      ~ 3,
                           x == 'Low'         ~ 2;
                           x == 'No Concerns' ~ 1))) %>% 
  convert(num(x))

这对我来说效果更好,特别是因为 recode 命令对公式更敏感:

items<-c("a","b","c")

df[items] <- lapply(df[items], function(x) ifelse(x=="STRONGLY AGREE", 6,
  ifelse(x=="AGREE", 5,
  ifelse(x=="SLIGHTLY AGREE", 4,
  ifelse(x=="SLIGHTLY DISAGREE", 3,
  ifelse(x=="DISAGREE", 2,
  ifelse(x=="STRONGLY DISAGREE", 1,0)))))))