2016-11-22 43 views
0

我需要一个新的行添加到每个ID组,其中关键字=“n”和值是总 - A + B添加缺少的小计为每个组使用dplyr

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 

在这个例子中,所述新行应

 1  n  7 
     2  n  5 

我试图获得A + b小计和加入该总数量,以获得差异,但采用九个dplyr动词后,我似乎在错误的方向走了。谢谢。

回答

3

这不是一个连接,它只是在结合新行:

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 
1

下面是使用data.table,结合排在格里的回答道:

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