2016-09-27 10 views
1

Я изо всех сил, чтобы использовать dplyr и tidyr взять ФР в таком виде:dplyr tidyr расширить и подвести определенные столбцы

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  

и преобразовать в этот нужный формат:

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

Есть два шага. Измените этот вопрос следующим образом: http://stackoverflow.com/questions/20620492/reshape-long-to-wide-with-multiple-groupings, а затем суммируйте(), чтобы получить подсчеты/суммы. – MrFlick

ответ

0

Чуть более общий:

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() 

В вашем примере есть опечатка. Ответ должен быть:

# 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 

 Смежные вопросы

  • Нет связанных вопросов^_^