то, что в примере, не имеет отношения к "сводной таблице", поскольку каждая пара ключей встречается ровно один раз. Это просто развернутая в линию таблица, для нее достаточно превратить ее в таблицу, см. скрипт ниже, последние строки.
В реальности эта "сводная таблица" называется многомерным кубом (в ней может быть больше 2 ключей), или "шахматкой". Некоторые пары ключей могут встречаться больше одного раза, некоторые - ни разу, и нужна функция агрегации (в примере ниже - сумма). Я уверен, что существует не один десяток пакетов с хитромудрыми функциями, которые это могут делать, однако с ними обычно те же проблемы, что и с ggplot2 - проще написать самому
Ниже пример для суммы по всем парам ключей
Код: Выделить всё
set.seed(123)
Year <- sample(2018:2020, 15,replace=TRUE)
Name <- sample(LETTERS[1:3],15,replace=TRUE)
N <- sample(100:900, 15)
df <- data.frame(Year, Name, N)
df
Year Name N
1 2018 C 871
2 2020 A 821
3 2019 A 651
4 2020 A 734
5 2020 C 119
6 2018 C 480
7 2019 C 702
8 2020 B 271
9 2019 C 352
10 2019 B 283
11 2020 C 212
12 2019 B 427
13 2020 B 426
14 2019 A 390
15 2018 A 219
Year.list=sort(unique(df$Year))
Name.list=sort(unique(df$Name))
tmp=expand.grid(Year.list,Name.list)
all.key=sprintf("%d-%s",tmp[,1],tmp[,2])
all.val=rep(0,length(all.key))
key=sprintf("%d-%s",df$Year,df$Name)
val=tapply(df$N,key,sum)
val.key=attr(val, "dimnames")[[1]]
key.pos=match(val.key,all.key)
all.val[key.pos]=val
val.mtr=matrix(all.val,ncol=length(Year.list),nrow=length(Name.list),byrow=TRUE)
colnames(val.mtr)=Year.list
rownames(val.mtr)=Name.list
val.mtr
2018 2019 2020
A 219 1041 1555
B 0 710 697
C 1351 1054 331