用数据 R 的每个部分的总和填充 Dataframe 中的空白行

Fill Blank Rows in Dataframe with Sums for each section of data R

我有在数据框中按项目描述和类型分隔的数据。分隔符是空白行,但我想用每个描述的数值总和填充空白行,如果可能的话,在总和下方添加另一个空白行。最好是,我不需要对仅包含一行的数据部分求和 - 请参阅变量 desc“a”,但如果我确实在那里得到总和,那没什么大不了的。

这是我现在拥有的示例:

   desc   type  xvalue yvalue
1      a     z     16      1
2
3      b     y     17      2
4      b     y     18      3
5
6      c     x     19      4
7      c     x     20      5
8      c     x     21      6
9
10     d     x    22      7
11     d     x    23      8
12
13     d     y    24      9
14     d     y    25     10

我要找的是与此类似的输出。

  desc   type  xvalue yvalue
1      a     z     16      1
2
3      b     y     17      2
4      b     y     18      3
5                  35      5 
6
7      c     x     19      4
8      c     x     20      5
9      c     x     21      6
10                 40      15
11
12     d     x    22      7
13     d     x    23      8
14                45      15
15
16     d     y    24      9
17     d     y    25     10
18                49     19 

我在一列而不是一行中找到了关于如何执行此操作的答案。 Adding column of summed data by group with empty rows with R

我使用了 acylam 对这个问题的 dplyr 答案 Add blank rows in between existing rows 来创建空行。我稍微更改了代码以更好地适应我的数据,所以我的代码是:

library(dplyr)
df %>%
  split(df$id, df$group) %>%
  Map(rbind, ., "") %>%
  do.call(rbind, .)

我希望我可以在上面的 do.call(rbind...) dplyr 代码中添加选项。

根据您的数据组织方式,我们可以这样做:

假设空行是 NA(如果不是,例如它们是空白的,我们可以将它们设为 NA

我们在分组后使用 group_split(),得到一个列表,然后使用看门人的 adorn_totals

在列表上迭代 map_df

library(dplyr)
library(janitor)
df %>% 
  na.omit() %>% # maybe you don't need this line
  group_by(desc, type) %>% 
  group_split() %>% 
  purrr::map_df(., janitor::adorn_totals) 

 desc type xvalue yvalue
     a    z     16      1
 Total    -     16      1
     b    y     17      2
     b    y     18      3
 Total    -     35      5
     c    x     19      4
     c    x     20      5
     c    x     21      6
 Total    -     60     15
     d    x     22      7
     d    x     23      8
 Total    -     45     15
     d    y     24      9
     d    y     25     10
 Total    -     49     19

数据:

structure(list(desc = c("a", NA, "b", "b", NA, "c", "c", "c", 
NA, "d", "d", NA, "d", "d"), type = c("z", NA, "y", "y", NA, 
"x", "x", "x", NA, "x", "x", NA, "y", "y"), xvalue = c(16L, NA, 
17L, 18L, NA, 19L, 20L, 21L, NA, 22L, 23L, NA, 24L, 25L), yvalue = c(1L, 
NA, 2L, 3L, NA, 4L, 5L, 6L, NA, 7L, 8L, NA, 9L, 10L)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14"))

这是添加空行并从@TarJae 的回答中删除 janitor's 添加内容的完整答案:

library(dplyr)
library(janitor)

df <- df %>% 
    na.omit() %>% # maybe you don't need this line
    group_by(desc, type) %>% 
    group_split() %>% 
    purrr::map_df(., \(x) {x <- x %>% janitor::adorn_totals() %>% rbind(NA)}) %>% 
    mutate(
        desc = ifelse(desc == "Total", NA, desc),
        type = ifelse(type == "-", NA, type)
    )