合并不同因子水平下的数据,同时保留原始水平

miw*_*win 4 r factors dplyr forcats

我想为以下问题提供一个 tidyverse 解决方案。在我的数据集中,我有各种因子水平的数据。我想创建一个新的因子级别“总计”,它是 X 的现有因子级别上所有值 Y 的总和。例如,可以使用以下方法完成:

mutate(Data, X = fct_collapse(X, Total = c("A", "B", "C", "D"))) %>%
  group_by(X) %>% 
  summarize(Y = sum(Y))
Run Code Online (Sandbox Code Playgroud)

但是,这也必然会覆盖原始因子水平。我必须在额外的步骤中将原始数据集与新的折叠数据集结合起来。

我在过去保留原级别使用的一个解决方案是在宽幅带来数据和进行rowwise(),并mutate()与“总”,然后重塑回龙创建一个新的变量。

spread(Data, key = X, value = Y) %>%
  rowwise() %>%
  mutate(Total = sum(A, B, C, D)) %>%
  gather(1:5, key = "X", value = "Y")
Run Code Online (Sandbox Code Playgroud)

但是,我对这个解决方案非常不满意,因为使用rowwise()不被认为是好的做法。如果您能指出一个可用的替代解决方案如何在保留原始水平的同时合并不同因子水平下的数据,那就太好了。

最小可重现示例:

Data<-data.frame(
X = factor(c("A", "B", "C", "D")),
Y = c(1000, 2000, 3000, 4000))
Run Code Online (Sandbox Code Playgroud)

预期结果:

# A tibble: 5 x 2
  X         Y
  <chr> <dbl>
1 A      1000
2 B      2000
3 C      3000
4 D      4000
5 Total 10000
Run Code Online (Sandbox Code Playgroud)

M--*_*M-- 5

使用库,这将很简单。

Data %>% janitor::adorn_totals("row") %>% mutate(X=factor(X))

  # X     Y
  # A     1000
  # B     2000
  # C     3000
  # D     4000
  # Total 10000
Run Code Online (Sandbox Code Playgroud)

查看输出结构:

str(output)

# 'data.frame': 5 obs. of  2 variables:
#  $ X: Factor w/ 5 levels "A","B","C","D",..: 1 2 3 4 5
#  $ Y: num  1000 2000 3000 4000 10000
Run Code Online (Sandbox Code Playgroud)