2016-02-23 4 views
3
expand.grid(country = c('Sweden','Norway', 'Denmark','Finland'), 
      sport = c('curling','crosscountry','downhill')) %>% 
    mutate(medals = sample(0:3, 12, TRUE)) -> 
data 

Использование dcast для reshape2 достигает этого в одной строке. Использование пользовательских имен для полей требует дополнительных шагов.Подсчитайте промежуточные итоги с помощью dplyr и tidyr

library(reshape2) 

data %>% 
    dcast(country ~ sport, margins = TRUE, sum) %>% 

# optional renaming of the margins `(all)` 
    rename(Total = `(all)`) %>% 
    mutate(country = ifelse(country == "(all)", "Total", country)) 

Мой подход dplyr + tidyr является подробным. Каков наилучший (компактный и читаемый) способ записи с использованием tidyr и dplyr.

library(dplyr) 
library(tidyr) 

data %>% 
    group_by(sport) %>% 
    summarise(medals = sum(medals)) %>% 
    mutate(country = 'Total') -> 
    sport_totals 

data %>% 
    group_by(country) %>% 
    summarise(medals = sum(medals)) %>% 
    mutate(sport = 'Total') -> 
    country_totals 

data %>% 
    summarise(medals = sum(medals)) %>% 
    mutate(sport = 'Total', 
     country = 'Total') -> 
    totals 

data %>% 
    bind_rows(country_totals, sport_totals, totals) %>% 
    spread(sport, medals) 
+0

Это одна из тех основных вещей, которые до смешного легко в Excel и WAY (!) слишком много времени в R. Рекомендуем вам проверить [rpivotTable] (https://cran.r-project.org/web/packages/rpivotTable/vignettes/rpivotTableIntroduction.html) – Nettle

ответ

3

Я не знаю, если это лучшее (компактный и читаемым) но он работает;)

data %>% 
    spread(sport, medals) %>% 
    mutate(Total = rowSums(.[2:4])) %>% 
    rbind(., data.frame(country="Total", t(colSums(.[2:5])))) 

    country curling crosscountry downhill Total 
1 Sweden  0   2  0  2 
2 Norway  1   1  0  2 
3 Denmark  2   2  1  5 
4 Finland  3   0  2  5 
5 Total  6   5  3 14 
Смежные вопросы