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