gpt4 book ai didi

R:转换为与 case_when 相同的级别顺序的因子

转载 作者:行者123 更新时间:2023-12-04 11:43:38 25 4
gpt4 key购买 nike

在进行数据分析时,有时需要将值重新编码为因子以进行组分析。我想保持因子的顺序与 case_when 中指定的转换顺序相同.在这种情况下,订单应该是 "Excellent" "Good" "Fail" .我怎样才能做到这一点,而不像 levels=c('Excellent', 'Good', 'Fail') 那样冗长乏味地再次提及它? ?

非常感谢。

library(dplyr, warn.conflicts = FALSE)             

set.seed(1234)
score <- runif(100, min = 0, max = 100)

Performance <- function(x) {
case_when(
is.na(x) ~ NA_character_,
x > 80 ~ 'Excellent',
x > 50 ~ 'Good',
TRUE ~ 'Fail'
) %>% factor(levels=c('Excellent', 'Good', 'Fail'))
}

performance <- Performance(score)
levels(performance)
#> [1] "Excellent" "Good" "Fail"
table(performance)
#> performance
#> Excellent Good Fail
#> 15 30 55

编辑:我的解决方案

最后,我想出了一个解决方案。对于那些有兴趣的人,这是我的解决方案。我写了一个函数 fct_case_when (假装是 forcats 中的一个函数)。它只是 case_when 的包装器与因子输出。级别的顺序与参数顺序相同。

fct_case_when <- function(...) {
args <- as.list(match.call())
levels <- sapply(args[-1], function(f) f[[3]]) # extract RHS of formula
levels <- levels[!is.na(levels)]
factor(dplyr::case_when(...), levels=levels)
}

现在,我可以使用 fct_case_when代替 case_when ,结果将与之前的实现相同(但不那么乏味)。

Performance <- function(x) {                       
fct_case_when(
is.na(x) ~ NA_character_,
x > 80 ~ 'Excellent',
x > 50 ~ 'Good',
TRUE ~ 'Fail'
)
}
performance <- Performance(score)
levels(performance)
#> [1] "Excellent" "Good" "Fail"
table(performance)
#> performance
#> Excellent Good Fail
#> 15 30 55

最佳答案

默认情况下,级别按字典顺序设置。如果您不想指定它们,您可以将它们设置为正确的字典顺序( Performance1 ),或者创建一个 levels向量一次,并在生成因子和设置级别时使用它( Performance2 )。我不知道这两者中的任何一个会为您节省多少努力或繁琐,但它们就在这里。看看我的第三条建议,我认为这是最不乏味的方式。

Performance1 <- function(x) {                       
case_when(
is.na(x) ~ NA_character_,
x > 80 ~ 'Excellent',
x <= 50 ~ 'Fail',
TRUE ~ 'Good',
) %>% factor()
}

Performance2 <- function(x, levels = c("Excellent", "Good", "Fail")){
case_when(
is.na(x) ~ NA_character_,
x > 80 ~ levels[1],
x > 50 ~ levels[2],
TRUE ~ levels[3]
) %>% factor(levels)
}
performance1 <- Performance1(score)
levels(performance1)
# [1] "Excellent" "Fail" "Good"
table(performance1)
# performance1
# Excellent Fail Good
# 15 55 30

performance2 <- Performance2(score)
levels(performance2)
# [1] "Excellent" "Good" "Fail"
table(performance2)
# performance2
# Excellent Good Fail
# 15 30 55

如果我能提出一个更不乏味的方法:
performance <- cut(score, breaks = c(0, 50, 80, 100), 
labels = c("Fail", "Good", "Excellent"))
levels(performance)
# [1] "Fail" "Good" "Excellent"
table(performance)
# performance
# Fail Good Excellent
# 55 30 15

关于R:转换为与 case_when 相同的级别顺序的因子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49572416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com