我想要一个tidyverse的解决方案来解决以下问题。在我的数据集中,我有各种因子水平的数据。我想创建一个新的因子水平“总计”,它是现有因子水平X的所有Y值的总和。例如,可以使用以下代码实现:
然而,这也必然会覆盖原始的因子水平。我将不得不在另一个步骤中将原始数据集与新的折叠数据集结合起来。
我过去使用的一种保留原始水平的解决方案是将数据带入宽格式,并继续使用
mutate(Data, X = fct_collapse(X, Total = c("A", "B", "C", "D"))) %>%
group_by(X) %>%
summarize(Y = sum(Y))
然而,这也必然会覆盖原始的因子水平。我将不得不在另一个步骤中将原始数据集与新的折叠数据集结合起来。
我过去使用的一种保留原始水平的解决方案是将数据带入宽格式,并继续使用
rowwise()
和mutate()
创建一个新变量,其中包含“总计”,然后再转换为长格式。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
df %>% janitor::adorn_totals("row")
这个对你来说可以吗?它需要加载一个额外的包,并且Total
不会被添加为一个因子。 - M--bind_self
的函数:https://github.com/camille-s/camiller/blob/master/R/bind_self.R 这超出了SO答案的范围。 - camilletidyverse
解决方案吗?我是在概念上提问,而不是争论你可能更喜欢什么,这显然完全取决于你。 - M--