Мы можем получить значения unique
в Type
для каждого ID
и связать данные вместе, используя rowr::cbind.fill
, заполнив отсутствующие значения пустой строкой.
setNames(do.call(rowr::cbind.fill, c(by(df$Type, df$ID, unique), fill = "")),
unique(df$ID))
# X Y Z
#1 A C F
#2 B D
#3 E
данные
df <- structure(list(ID = c("X", "X", "X", "Y", "Y", "Y", "Z", "Z"),
Type = c("A", "A", "B", "C", "D", "E", "F", "F")),
class = "data.frame", row.names = c(NA, -8L))