我有以下数据框架:
df = data.frame(a = 1:5) %>% as_tibble()我希望将值1和3折叠为“group2 1”,将2和4折叠为“group2”,将其他值(例如,5)折叠为“other”。我认为fct_collapse()是一个完美的函数,但是它会做一些奇怪的事情.
df %>%
mutate(
a = as.character(a),
a_collapse = fct_collapse(a,
group1=c('1', '3'),
group2 = c('2', '4'),
group_other = TRUE))然而,值3得到的是'group2‘而不是’group1 1‘。你知道为什么会发生这种事吗?我想这与我的因子的数值是数字有关,但没有找到解决方法。有什么想法吗?
有些帖子涉及类似的问题,但在这种情况下对我没有帮助:
发布于 2020-01-29 11:28:08
简单的case_when?
library(dplyr)
df %>%
mutate(a_collapse = factor(case_when(a %in% c(1, 3)~"group1",
a %in% c(2, 4) ~"group2",
TRUE ~ 'Other')))
# A tibble: 5 x 2
# a a_collapse
# <int> <fct>
#1 1 group1
#2 2 group2
#3 3 group1
#4 4 group2
#5 5 Other 就fct_collapse而言,问题似乎来自于将group_other包括在内,就像在Github上的问题中引用的那样。如果我们删除它,它可以正常工作,但不会给其他组带来任何价值。
df %>%
mutate(
a = as.character(a),
a_collapse = forcats::fct_collapse(a,
group1=c('1', '3'),
group2 = c('2', '4')))
# A tibble: 5 x 2
# a a_collapse
# <chr> <fct>
#1 1 group1
#2 2 group2
#3 3 group1
#4 4 group2
#5 5 5 此bug已在forcats的开发版本中修复,并将在下一个版本中使用。
发布于 2020-01-29 12:27:33
这里有一个替代方法,使用dplyr::recode()
df %>%
mutate(
a = as.character(a),
a_new = recode(a,
'1' = 'group1',
'2' = 'group2',
'3' = 'group1',
'4' = 'group1',
'5' = 'Other'))https://stackoverflow.com/questions/59966044
复制相似问题