R:用数字替换因子变量

sta*_*oob 0 lookup r data-manipulation dataframe

我正在使用 R 编程语言。

我有以下数据集:

factor_1 <- c("A", "B", "C", "D", "E")
factor_2 <- c("AA", "BB", "CC", "DD", "EE")
factor_3 <- c("AAA", "BBB", "CCC", "DDD", "EEE")

var_1 <- as.factor(sample(factor_1, 10000, replace=TRUE, prob=c(0.2, 0.2, 0.2, 0.2, 0.2)))
var_2 <- as.factor(sample(factor_2, 10000, replace=TRUE, prob=c(0.2, 0.2, 0.2, 0.2, 0.2)))
var_3 <- as.factor(sample(factor_3, 10000, replace=TRUE, prob=c(0.2, 0.2, 0.2, 0.2, 0.2)))
var_4 <- rnorm(1000,10,10)
var_5 <- rnorm(1000,10,10)

my_data = data.frame(var_1, var_2, var_3, var_4, var_5)

  var_1 var_2 var_3     var_4     var_5
1     B    AA   EEE 13.645347 13.058532
2     E    AA   DDD  6.845906 -5.503625
3     D    CC   DDD 25.521964 10.438531
4     A    BB   DDD 18.050013 -5.040709
5     D    EE   AAA 21.583362  1.269998
6     D    BB   AAA 14.797192 11.924158
Run Code Online (Sandbox Code Playgroud)

想象一下我们只有“my_data” - 我想用整数替换所有因素。

目前,我正在手动执行此操作:

首先,我创建了一个“字典”,将因子(“级别”)映射到整数“id”):

levels_1 = data.frame(id = 1:length(levels(my_data$var_1)), levels_1 = levels(my_data$var_1))
levels_2 = data.frame(id = 1:length(levels(my_data$var_2)), levels_2 = levels(my_data$var_2))
levels_3 = data.frame(id = 1:length(levels(my_data$var_3)), levels_3 = levels(my_data$var_3))
Run Code Online (Sandbox Code Playgroud)

然后,我尝试编写一个使用这个“字典”进行替换的代码:

my_data$var_1 <- factor(my_data$var_1, labels=levels_1$levels_1, levels = levels_1$id)
my_data$var_2 <- factor(my_data$var_2, labels=levels_2$levels_2, levels = levels_2$id)
my_data$var_3 <- factor(my_data$var_3, labels=levels_3$levels_3, levels = levels_3$id)
Run Code Online (Sandbox Code Playgroud)

但我收到这个错误:

Error in factor(my_data$var_1, labels = levels_1$levels_1, levels = levels_1$id) : 
  invalid 'labels'; length 0 should be 1 or 5
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我我做错了什么以及如何解决这个问题 - 一般来说,是否有一种“更快”的方法可以对许多变量执行此操作,而无需手动创建这些字典和查找?

最终的输出看起来像这样:

  var_1 var_2 var_3     var_4     var_5
1     2    1   5  13.645347 13.058532
2     5    1   4   6.845906 -5.503625
3     4    3   4  25.521964 10.438531
4     1    2   4  18.050013 -5.040709
5     4    4   1  21.583362  1.269998
6     4    2   1 14.797192 11.924158
Run Code Online (Sandbox Code Playgroud)

谢谢!

ben*_*n23 6

如果您只想将因子更改为整数,as.numeric就已经足够了。该因子将根据因子级别的顺序更改为数字。

正如 @Maurits Evers 的建议,我已将原来的更改as.numericas.integer.

library(dplyr)

my_data %>% mutate(across(var_1:var_3, as.integer))

 var_1 var_2 var_3     var_4     var_5
1     1     3     3 16.317711 26.484805
2     5     3     2 -5.106064 14.346322
3     5     1     4 15.734128 11.340518
4     1     1     2  8.125220 25.393141
5     5     5     1 11.603335  5.525315
6     5     4     4  6.238757 16.657790
Run Code Online (Sandbox Code Playgroud)

  • 我建议使用“as.integer”而不是“as.numeric”。因子存储为带有标签的整数值。如果您不想标记列,可以使用“across(where(is.factor), as.integer)”,它将转换*所有*因子列。 (2认同)