Другое предложение с использованием data.table
rbindlist(
DT[, .(.(cbind(ID, .SD, t(structure(PRO, names=POS))))), by=ID]$V1,
use.names=TRUE, fill=TRUE)
# ID PRO POS 1 2 3 4
#1: 1 A 1 A B C D
#2: 1 B 2 A B C D
#3: 1 C 3 A B C D
#4: 1 D 4 A B C D
#5: 2 A 1 A B C NA
#6: 2 B 2 A B C NA
#7: 2 C 3 A B C NA
#8: 3 A 1 A B NA NA
#9: 3 B 2 A B NA NA
Эквивалент в базе:
rbindlist(
by(DT, DT$ID, function(x) cbind(x, t(structure(x$PRO, names=x$POS)))),
use.names=TRUE, fill=TRUE)
data:
library(data.table)
DT <- fread("ID PRO POS
1 A 1
1 B 2
1 C 3
1 D 4
2 A 1
2 B 2
2 C 3
3 A 1
3 B 2")