我有一个数据框,我希望从长到大的形式进行转置。我的顾问建议使用unstack,甚至写了一些示例代码来帮助我。我能够很好地运行他的示例代码(使用占位符变量)但我实际上将它应用于我的数据时遇到了麻烦。这是我的“示例代码:”
Data1 <- data.frame(
DWNSTID = c(1, 1, 2, 2, 2),
Load = c(3, NA, 10, NA, NA),
X1 = c(10,14, 20, 40, 10),
X2=c(3,5,1,2,3),
Z1 = c(0.2, 0.7, 0.4, 0.3,0.2)
)
oo <- order(Data1$DWNSTID)
Data1 <- Data1[oo,]
Y <- Data1$Load[!is.na(Data1$Load)]
id <- as.numeric(ordered(Data1$DWNSTID))
idtbl <- table(id)
ns <- max(idtbl)
nr <- max(id)
my.unstack <- function(X, ID, nc=ns, x.names){
temp <- tapply(Data1$X1, Data1$DWNSTID, FUN=function(x, ns=nc){
tt <- as.vector(x)
if (length(tt) < ns)
tt <- c(tt, rep(0, ns-length(tt)))
return(tt)})
temp <- as.data.frame(matrix(unlist(temp), nrow=nr, ncol=ns, byrow=T))
names(temp) <- x.names
return(temp)
}
X1.names <- paste("X1", 1:ns, sep="_")
X2.names <- paste("X2", 1:ns, sep="_")
Z1.names <- paste("Z1", 1:ns, sep="_")
X1 <- my.unstack(Data1$X1, Data1$DWNSTID, nc=ns, X1.names)
X2 <- my.unstack(Data1$X2, Data1$DWNSTID, nc=ns, X2.names)
Z1 <- my.unstack(Data1$Z1, Data1$DWNSTID, nc=ns, Z1.names)
Data1_reshaped <- cbind (Y, X1,X2, Z1)
以下是插入了我感兴趣的变量的代码(我省略了我不需要更改/运行的部分,因为我不想比我已经拥有的更混乱了帖子):
X1 <- Data1$AG[!is.na(Data1$AG)]
X2 <- Data1$NONAG[!is.na(Data1$NONAG)]
Z1 <- Data1$HSG[!is.na(Data1$HSG)]
X1.names <- paste("X1", 1:ns, sep="_")
X2.names <- paste("X2", 1:ns, sep="_")
Z1.names <- paste("Z1", 1:ns, sep="_")
X1 <- my.unstack(Data1$X1, Data1$DWNSTID, nc=ns, X1.names)
X2 <- my.unstack(Data1$X2, Data1$DWNSTID, nc=ns, X2.names)
Z1 <- my.unstack(Data1$Z1, Data1$DWNSTID, nc=ns, Z1.names)
Data1_reshaped <- cbind (Y, X1,X2, Z1)
任何人都可以告诉我为什么最后4行不会运行?我收到的信息是矢量长度不同但不确定如何解决这个问题。具体来说,X1,X2和Z1都是一个长度,但X1.names,X2.names和Z1.names都是不同的长度。重塑数据时,这个问题不是固有的吗?我绝对不希望有人为我解决这个问题,但我会很感激我在这一点上可以尝试的建议。
我的目标是数据帧中的每一行对应一个LOAD值,而列则为AG1,AG2,AG3等。
答案 0 :(得分:0)
这应该可以帮到你,因为它可以解决不同的维度问题。只需重复每个感兴趣的变量并合并在一起。
library(data.table)
Data1 <- data.frame(
DWNSTID = c(1, 1, 2, 2, 2),
Load = c(3, NA, 10, NA, NA),
X1 = c(10,14, 20, 40, 10),
X2=c(3,5,1,2,3),
Z1 = c(0.2, 0.7, 0.4, 0.3,0.2)
)
Data1.dt <- data.table(Data1)
Data1.dt[,"group.id" := seq_len(.N), by=DWNSTID]
datax1 <- Data1.dt[,c("DWNSTID", "X1", "group.id"),with=FALSE]
X1 <- reshape(datax1, timevar = "group.id", idvar = 'DWNSTID', direction = "wide")