在 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
的帮助文件,您会发现该函数需要一个数值向量、字符向量或一个因子作为输入。但是,在您的代码中,您提供了一个列表。上面的代码提供了单独的列来重新编码,这应该可以工作。当然,没有合适的示例数据,很难说,但试试看。
使用 dplyr 和 hablar 的解决方案:
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)))))))
我正在使用 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
的帮助文件,您会发现该函数需要一个数值向量、字符向量或一个因子作为输入。但是,在您的代码中,您提供了一个列表。上面的代码提供了单独的列来重新编码,这应该可以工作。当然,没有合适的示例数据,很难说,但试试看。
使用 dplyr 和 hablar 的解决方案:
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)))))))