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)
谢谢!
如果您只想将因子更改为整数,as.numeric就已经足够了。该因子将根据因子级别的顺序更改为数字。
正如 @Maurits Evers 的建议,我已将原来的更改as.numeric为as.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)