2016-11-22 4 views
0

Ich brauche eine neue Zeile zu jeder ID-Gruppe hinzuzufügen, wo der Schlüssel = „n“ und den Wert der Gesamt ist - a + bhinzufügen Teilsummen jeder Gruppe fehlt mit 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 

In diesem Beispiel ist die neue Zeilen sollten

 1  n  7 
     2  n  5 

seine ich versuchte, den a + b Wert Ihrer bekommen und dass auf die Gesamtzahl Verbindungs ​​den Unterschied zu bekommen, aber neun dplyr Verben nach der Verwendung scheine ich in der falschen Richtung zu sein. Vielen Dank.

Antwort

3

Dies ist kein beitreten, es ist nur verbindlich neue Zeilen auf:

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

Hier ist eine Art und Weise data.table, verbindliche Reihen als in Gregors Antwort mit:

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 
Verwandte Themen