如何在R管道dplyr中包含以上几行和的数据框的特定索引中插入行



for dataframe,

df <- data.frame(id = c(rep(101, 4), rep(202, 3)),
status = c("a","b","c","d", "a", "b", "c"),
wt = c(100,200,100,105, 20,22,25),
ht = c(5.3,5.2,5,5.1, 4.3,4.2,4.1))

df
id status  wt  ht
1 101      a 100 5.3
2 101      b 200 5.2
3 101      c 100 5.0
4 101      d 105 5.1
5 202      a  20 4.3
6 202      b  22 4.2
7 202      c  25 4.1

我想得到下面的输出:

> output
id status  wt   ht
1 101      a 100  5.3
2 101      b 200  5.2
3 101      c 100  5.0
4 101      d 105  5.1
5 101    sum 505 20.6
6 202      a  20  4.3
7 202      b  22  4.2
8 202      c  25  4.1
9 202    sum  67 12.6

df来自一个管道序列,我不想停止它并做一些类似

的事情
output <- rbind(df[1:4,],
c(101, "sum", colSums(df[1:4, c(3,4)])),
df[5:7,],
c(202, "sum", colSums(df[5:7, c(3,4)])))

我在找一个整洁,好看的!实现这一目标的方法。任何帮助或想法都是非常感谢的。

df %>%
....

我们可以在按'id'分组后使用adorn_totals

library(dplyr)
library(janitor)
df %>% 
group_by(id) %>%
group_modify(~ .x %>% 
adorn_totals(cols = c(wt, ht), name = 'sum')) %>%
ungroup

与产出

# A tibble: 9 × 4
id status    wt    ht
<dbl> <chr>  <dbl> <dbl>
1   101 a        100   5.3
2   101 b        200   5.2
3   101 c        100   5  
4   101 d        105   5.1
5   101 sum      505  20.6
6   202 a         20   4.3
7   202 b         22   4.2
8   202 c         25   4.1
9   202 sum       67  12.6

使用tibble::add_row,更灵活一些:

library(tidyverse)
df %>% 
group_by(id) %>% 
group_modify(~ .x %>% add_row(status = "sum", wt = sum(.$wt), ht = sum(.$ht)))
# A tibble: 9 × 4
# Groups:   id [2]
id status    wt    ht
<dbl> <chr>  <dbl> <dbl>
1   101 a        100   5.3
2   101 b        200   5.2
3   101 c        100   5  
4   101 d        105   5.1
5   101 sum      505  20.6
6   202 a         20   4.3
7   202 b         22   4.2
8   202 c         25   4.1
9   202 sum       67  12.6

另一种可能的解决方案,基于colSumsdplyr:

library(dplyr)

df %>% 
group_by(id) %>% 
group_modify(~ add_row(.x, status = "Sum", !!!colSums(.[2:3]))) %>% 
ungroup
#> # A tibble: 9 × 4
#>      id status    wt    ht
#>   <dbl> <chr>  <dbl> <dbl>
#> 1   101 a        100   5.3
#> 2   101 b        200   5.2
#> 3   101 c        100   5  
#> 4   101 d        105   5.1
#> 5   101 Sum      505  20.6
#> 6   202 a         20   4.3
#> 7   202 b         22   4.2
#> 8   202 c         25   4.1
#> 9   202 Sum       67  12.6

最新更新