使用dplyr向每组添加缺少的小计
我需要为每个id组添加一个新行,其中key=“n”和value是总计-a+b使用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&
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