Мы группируем по «Фактору1», «Фактору2», «Году», получаем sum
всех столбцов (summarise_all
), затем gather
в «длинном» формате, unite
«Году», «ключевые» столбцы вместе, чтобы создать один столбец и spread
из «длинного» в «широкий» формат
library(tidyverse)
df %>%
group_by(Factor1, Factor2, Year) %>%
summarise_all(sum) %>%
gather(key, value, value1:value2) %>%
unite(Year, key, Year, sep=".") %>%
spread(Year, value)
# Groups: Factor1, Factor2 [2]
# Factor1 Factor2 value1.2015 value1.2016 value2.2015 value2.2016
# <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#1 A green 5.9 1.9 50 20
#2 B yellow 3 8 10 11
Это также можно сделать с помощью dcast
из data.table
, где мы можем передать несколько столбцов value.var
и аргумент fun.aggregate
library(data.table)
dcast(setDT(df), Factor1 + Factor2 ~ Year, value.var = c('value1', 'value2'), sum)
# Factor1 Factor2 value1_2015 value1_2016 value2_2015 value2_2016
#1: A green 5.9 1.9 50 20
#2: B yellow 3.0 8.0 10 11
данные
df <- structure(list(Factor1 = c("A", "A", "A", "B", "B"), Factor2 = c("green",
"green", "green", "yellow", "yellow"), Year = c(2016L, 2015L,
2015L, 2015L, 2016L), value1 = c(1.9, 1.9, 4, 3, 8), value2 = c(20L,
20L, 30L, 10L, 11L)), class = "data.frame", row.names = c(NA,
-5L))