将因子转换为整数,同时保持因子水平的顺序。

6
在我的R数据框中,有一列是因子,其级别具有隐含的排序。如何按以下方式将因子级别转换为特定整数:
- "强烈不同意" --> 1 - "有点不同意" --> 2 - "中立" --> 3 - "有点同意" --> 4 - "非常同意" --> 5
例如,这是我的数据框:
agree <- c("Strongly agree", "Somewhat disagree", "Somewhat agree",
           "Neutral", "Strongly agree", "Strongly disagree", "Neutral")
age <- c(41, 35, 29, 42, 31, 22, 58)

df <- data.frame(age, agree)
df
#   age             agree
# 1  41    Strongly agree
# 2  35 Somewhat disagree
# 3  29    Somewhat agree
# 4  42           Neutral
# 5  31    Strongly agree
# 6  22 Strongly disagree
# 7  58           Neutral

str(df)
# 'data.frame': 7 obs. of  2 variables:
#  $ age  : num  41 35 29 42 31 22 58
#  $ agree: Factor w/ 5 levels "Neutral","Somewhat agree",..: 4 3 2 1 4 5 1

现在,我想使用我展示的映射将agree列转换为整数列。
我已经搜索了其他关于将因子转换为整数的问题,但它们与维护因子排序无关。
"如何在不丢失信息的情况下将因子转换为整数\numeric?"
"将因子转换为整数"
"将因子转换为数据框中的整数"

这个问题应该会有所帮助:http://stackoverflow.com/q/37431872/2372064,但是想法就是指定因子的 levels= - MrFlick
1
在构建因子变量时,您可以通过指定“levels”参数来设置其级别。as.integer(factor(..., levels = ...)) - Psidom
3个回答

9

首先需要定义因子的顺序:

ordering <- c("Strongly disagree", "Somewhat disagree", "Neutral", "Somewhat agree", "Strongly agree")

然后,当您首次创建因子时,您应该使用该定义:

agreeFactor <- factor(agree, levels = ordering)

然后,你应该能够获取你订购的因子:
as.numeric(agreeFactor)

当使用as.numeric()函数时,你也可以直接应用“levels=”参数,但如果你之后想要检索数字向量却忘记了应用该参数,会导致不一致的情况。

如果你希望直接将数字导入数据框中,请使用以下方法:

df$agree <- as.numeric(factor(df$agree, levels = ordering))

那么在我的原始代码中,我应该使用:df$agree <- as.numeric(factor(df$agree, levels = ordering)) 吗? - stackoverflowuser2010
可以使用 df <- data.frame(age, agreeFactor) - tluh
1
我仍然需要调用 as.numericagreeFactor 转换为整数,对吗? - stackoverflowuser2010
如果您想将其插入到数据框中作为整数,则需要这样做。如果您提前设置了因子排序,则 df <- data.frame(age, as.numeric(agreeFactor)) 可以起作用。 - tluh
1
是的,我的原始问题确实是:“将因子转换为整数同时保持因子级别排序”。沿着这个方向,也许你可以编辑你的答案,使它更加健壮,以便帮助其他人阅读它。 - stackoverflowuser2010

2
如果您的因子已经按级别排序,您可以使用以下函数将该因子转换为数字顺序。"最初的回答"。
Convert_Numeric = function(X) {
        L = levels(X)
        Y = as.numeric(factor(X, labels = seq(1:length(L))))
        return(Y)
}

这在函数或dplyr中特别有用:

这可以特别有用,尤其是在函数或使用dplyr时:

df %>%
       mutate(Numeric_version = Convert_Numeric(agree))

1

dplyr库有一个有用的revalue函数,可以用于这种类型的操作:

library(plyr)
df$agree<-as.numeric( revalue(df$agree, c("Strongly disagree" = 1,
                     "Somewhat disagree" = 2,
                     "Neutral" = 3,
                     "Somewhat agree" = 4,
                     "Strongly agree" = 5)) )

@tluh的因素排序方法总体上是更好的方法,因为它保留了原始输入并将因素设置为正确的顺序。


为什么要重新调整水平,而不是直接指定顺序呢?as.numeric(factor(df$agree, c("强烈反对", "有些反对", "中立", "有些同意", "强烈同意"))) - pdb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接