我想为以下问题提供一个 tidyverse 解决方案。在我的数据集中,我有各种因素水平的数据。我想创建一个新的因子水平“总计”,它是 X 的现有因子水平上所有 Y 值的总和。这可以通过以下方式完成,例如:
mutate(Data, X = fct_collapse(X, Total = c("A", "B", "C", "D"))) %>%
group_by(X) %>%
summarize(Y = sum(Y))
但是,这也必然会覆盖原始因子水平。我必须在一个额外的步骤中将原始数据集与新折叠的数据集结合起来。
我过去用来保留原始级别的一种解决方案是将数据以宽格式引入并继续rowwise()
并mutate()
使用“Total”创建一个新变量,然后重新调整为 long。
spread(Data, key = X, value = Y) %>%
rowwise() %>%
mutate(Total = sum(A, B, C, D)) %>%
gather(1:5, key = "X", value = "Y")
但是,我对这个解决方案非常不满意,因为使用rowwise()
不被认为是好的做法。如果您能指出一个可用的替代解决方案如何在保留原始水平的同时组合不同因子水平下的数据,那就太好了。
最小的可重现示例:
Data<-data.frame(
X = factor(c("A", "B", "C", "D")),
Y = c(1000, 2000, 3000, 4000))
预期结果:
# A tibble: 5 x 2
X Y
<chr> <dbl>
1 A 1000
2 B 2000
3 C 3000
4 D 4000
5 Total 10000