我想对包含在单个变量中的类别子集求和,在 r 中组织为整洁的数据。
看起来应该很简单,但我只能想到大量的代码行来做到这一点。
下面是一个示例:
df = data.frame(food = c("carbs", "protein", "apple", "pear"), value = c(10, 12, 4, 3))
df
food value
1 carbs 10
2 protein 12
3 apple 4
4 pear 3
我希望数据框如下所示(将苹果和梨组合成水果(:
food value
1 carbs 10
2 protein 12
3 fruit 7
我能想到的方法是:
library(dplyr)
library(tidyr)
df %>%
spread(key = "food", value = "value") %>%
mutate(fruit = apple + pear) %>%
select(-c(apple, pear)) %>%
gather(key = "food", value = "value")
food value
1 carbs 10
2 protein 12
3 fruit 7
对于这么简单的事情来说,这似乎太长了。我还可以对数据进行子集化,对行求和,然后进行 rbind,但这似乎也很费力。
有什么更快的选择吗?
一个因子可以用forcats::fct_recode
重新编码,但这不一定更短。
library(dplyr)
library(forcats)
df %>%
mutate(food = fct_recode(food, fruit = 'apple', fruit = 'pear')) %>%
group_by(food) %>%
summarise(value = sum(value))
## A tibble: 3 x 2
# food value
# <fct> <dbl>
#1 fruit 7
#2 carbs 10
#3 protein 12
编辑。
我将在此处发布此评论中的代码,因为注释比答案更经常被删除。结果与上述相同。
df %>%
group_by(food = fct_recode(food, fruit = 'apple', fruit = 'pear')) %>%
summarise(value = sum(value))
怎么样:
df %>%
group_by(food = if_else(food %in% c("apple", "pear"), "fruit", food)) %>%
summarise_all(sum)
food value
<chr> <dbl>
1 carbs 10
2 fruit 7
3 protein 12