2016-09-27 4 views
1

J'ai du mal à utiliser dplyr et tidyr prendre une df sous cette forme:dplyr tidyr à élargir et à somme des colonnes spécifiques

myDf <- data.frame(id = c(1,1,1,1,2,2), 
        event = c('a','b','a','b','a','b'), 
        a_property = c(1,NA,2, NA, 3, NA), 
        b_property = c(NA,2,NA, 3, NA, 4)) 

> myDf 
id event a_property b_property 
1  a   1   NA 
1  b   NA   2 
1  a   2   NA 
1  b   NA   3 
2  a   3   NA 
2  b   NA   4  

et se transformer en ce format souhaité:

id count_event_a count_event_b sum_property_a sum_property_b 
1    2    2    3    5 
2    1    1    5    4 
+0

Faites deux étapes. Remodeler comme cette question: http://stackoverflow.com/questions/20620492/reshape-long-to-wide-with-multiple-groupings, puis résumer() pour obtenir des comptes/sommes. – MrFlick

Répondre

0

Un peu plus général:

myDf %>% 
    gather(key, value, -id, -event) %>% 
    filter(!is.na(value)) %>% 
    group_by(id, event) %>% 
    summarise(count = n(), 
      sum = sum(value)) %>% 
    gather(key, value, -id, -event) %>% 
    unite(measure, key, event) %>% 
    spread(measure, value) 
1
myDf %>% 
    group_by(id) %>% 
    summarise(count_event_a = sum(!is.na(a_property)), 
      count_event_b = sum(!is.na(b_property)), 
      sum_property_a = sum(a_property, na.rm = TRUE), 
      sum_property_b = sum(b_property, na.rm = TRUE)) %>% 
    ungroup() 

Il y a une faute de frappe dans votre exemple. La réponse devrait être:

# A tibble: 2 × 5 
    id count_event_a count_event_b sum_property_a sum_property_b 
    <dbl>   <int>   <int>   <dbl>   <dbl> 
1  1    2    2    3    5 
2  2    1    1    3    4