使用dplyr向每组添加缺少的小计

使用dplyr向每组添加缺少的小计,r,dplyr,R,Dplyr,我需要为每个id组添加一个新行,其中key=“n”和value是总计-a+b x <- data_frame( id = c(1,1,1,2,2,2,2), key = c("a","b","total","a","x","b","total"), value = c(1,2,10,4,1,3,12) ) # A tibble: 7 × 3 id key value <dbl> <chr&

我需要为每个id组添加一个新行,其中key=“n”和value是总计-a+b

x <- data_frame( id = c(1,1,1,2,2,2,2), 
                key = c("a","b","total","a","x","b","total"), 
              value = c(1,2,10,4,1,3,12) )

# A tibble: 7 × 3
     id   key value
  <dbl> <chr> <dbl>
1     1     a     1
2     1     b     2
3     1 total    10
4     2     a     4
5     2     x     1
6     2     b     3
7     2 total    12

我试着得到a+b小计,并将其与总计数相加以得到差异,但在使用了九个dplyr动词之后,我似乎走错了方向。谢谢。

这不是加入,它只是将新行绑定到:

x %>% group_by(id) %>%
    summarize(
      value = sum(value[key == 'total']) - sum(value[key %in% c('a', 'b')]),
      key = 'n'
    ) %>%
    bind_rows(x) %>%
    select(id, key, value) %>%  # back to original column order
    arrange(id, key)            # and a start a row order
# # A tibble: 9 × 3
#      id   key value
#   <dbl> <chr> <dbl>
# 1     1     a     1
# 2     1     b     2
# 3     1     n     7
# 4     1 total    10
# 5     2     a     4
# 6     2     b     3
# 7     2     n     5
# 8     2 total    12
# 9     2     x     1
x%>%group\u by(id)%>%
总结(
value=sum(value[key=='total'])-sum(value[key%in%c('a','b')),
键='n'
) %>%
绑定_行(x)%>%
选择(id、键、值)%>%#返回原始列顺序
排列(id、键)#并开始行顺序
##A tibble:9×3
#id键值
#     
#1 a 1
#2 1 b 2
#31N7
#4 1总计10
#5 2 a 4
#62B3
#7 2 n 5
#8 2总计12
#92x1

这不是一个连接,它只是将新行绑定到:

x %>% group_by(id) %>%
    summarize(
      value = sum(value[key == 'total']) - sum(value[key %in% c('a', 'b')]),
      key = 'n'
    ) %>%
    bind_rows(x) %>%
    select(id, key, value) %>%  # back to original column order
    arrange(id, key)            # and a start a row order
# # A tibble: 9 × 3
#      id   key value
#   <dbl> <chr> <dbl>
# 1     1     a     1
# 2     1     b     2
# 3     1     n     7
# 4     1 total    10
# 5     2     a     4
# 6     2     b     3
# 7     2     n     5
# 8     2 total    12
# 9     2     x     1
x%>%group\u by(id)%>%
总结(
value=sum(value[key=='total'])-sum(value[key%in%c('a','b')),
键='n'
) %>%
绑定_行(x)%>%
选择(id、键、值)%>%#返回原始列顺序
排列(id、键)#并开始行顺序
##A tibble:9×3
#id键值
#     
#1 a 1
#2 1 b 2
#31N7
#4 1总计10
#5 2 a 4
#62B3
#7 2 n 5
#8 2总计12
#92x1

以下是一种使用data.table绑定行的方法,如Gregor的回答所示:

library(data.table)
setDT(x)

dcast(x, id ~ key)[, .(id, key = "n", value = total - a - b)][, rbind(.SD, x)][order(id)]

   id   key value
1:  1     n     7
2:  1     a     1
3:  1     b     2
4:  1 total    10
5:  2     n     5
6:  2     a     4
7:  2     x     1
8:  2     b     3
9:  2 total    12

下面是一种使用data.table绑定行的方法,如Gregor的回答所示:

library(data.table)
setDT(x)

dcast(x, id ~ key)[, .(id, key = "n", value = total - a - b)][, rbind(.SD, x)][order(id)]

   id   key value
1:  1     n     7
2:  1     a     1
3:  1     b     2
4:  1 total    10
5:  2     n     5
6:  2     a     4
7:  2     x     1
8:  2     b     3
9:  2 total    12