【发布时间】:2019-02-12 16:21:38
【问题描述】:
我想为以下问题提供一个 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
【问题讨论】:
-
df %>% janitor::adorn_totals("row")这对你有用吗?它需要加载一个额外的包,Total不会被添加为一个因素。 -
原则上,该函数完全符合我一直在寻找的功能(稍微限定一下,将“Total”作为因子级别会很棒)。但是,我确实更喜欢这个问题的 tidyverse 解决方案。但我想然后必须定义我自己的功能,例如基于@Rui Barradas 的建议。
-
我经常做类似的事情,以至于我在我为工作而编写的包中添加了一个函数
bind_self:github.com/camille-s/camiller/blob/master/R/bind_self.R 这有点超出了 SO 答案的范围 -
@miwin 如果您编写自己的函数,这真的是
tidyverse解决方案吗?我是在概念上询问,而不是争论你可能更喜欢什么,显然,这完全取决于你。 -
@M-M 你的观点很好:) 我的意思是有一个不需要额外软件包的答案。但是您的解决方案无疑是最简洁的,而且非常有帮助。