取消堆叠数据框

Unstacking a data frame

我有一个如下所示的数据框:

d <- c("a", "b", "c", "a", "b", "c", "a", "b", "c")
par <- c("a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9")
df1 <- as.data.frame(cbind(id, par))

我希望它看起来像这样:

a <- c("a1", "a4", "a7")
b <- c("a2", "a5", "a8")
c <- c("a3", "a6", "a7")
df2 <- data.frame(rbind(a, b, c))

我已经按照下面的方式解决了这个问题,不过看起来太乱了

id <- c("a", "b", "c", "a", "b", "c", "a", "b", "c")
par <- c("a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9")
df1 <- as.data.frame(cbind(id, par))


ids <- levels(df1$id)

newdf <- list()

for ( i in 1:length(ids)){
tempdf <- df1[df1$id == ids[i],]
id <- tempdf[1,1]
parcels <- tempdf[,2]
row <- cbind(as.character(id), t(as.character(parcels)))
tempdf <- as.data.frame(row)
newdf[[i]] <- tempdf
}

df3 <- do.call(rbind.fill, newdf)

你可以用 unstack

as.data.frame(t(unstack(df1,par~id)))
#  V1 V2 V3
#a a1 a4 a7
#b a2 a5 a8
#c a3 a6 a9

或在为 'id' 组创建序列列后使用 dcast

library(data.table)#v1.9.5
dcast(setDT(df1)[, ind:= 1:.N, id], id~ind, value.var='par')