最好的选择是使用“reshape2”中的
melt
和
dcast
。但在我们采用该选项之前,让我们看看其他可用的选项:
你提到每个“id”行数不平衡。这会使得将其放入整洁的矩形
data.frame
中有些困难。
以下是一些示例:
平衡数据:每个“id”三行
mydf <- structure(list(id = c(1, 1, 1, 2, 2, 2),
D1 = c(0.4, 0, 0.53, 0.17, 0.25, 0.55),
D2 = c(0.21, 0, 0.2, 0.17, 0.25, 0.43)),
.Names = c("id", "D1", "D2"), row.names = c(NA, 6L),
class = "data.frame")
mydf
有了这些数据,您只需使用聚合
即可:
do.call(data.frame, aggregate(. ~ id, mydf, as.vector))
不平衡的数据:一些解决方法
如果您为“id = 2”添加了第四个值,则聚合
在此处将无法正常工作:
mydf[7, ] <- c(2, .44, .33)
do.call(data.frame, aggregate(. ~ id, mydf, as.vector))
最好只是拥有一个结果向量列表list
:
lapply(split(mydf[-1], mydf[[1]]), function(x) unlist(x, use.names=FALSE))
或者,如果您坚持使用矩形data.frame
,可以尝试使用几个工具中的一个来rbind
不平衡的数据,例如来自“plyr”的rbind.fill
:
library(plyr)
rbind.fill(lapply(split(mydf[-1], mydf[[1]]),
function(x) data.frame(t(unlist(x, use.names=FALSE)))))
不平衡数据:更直接的方法
或者,您可以使用“reshape2”中的melt
和dcast
,如下所示:
library(reshape2)
x <- melt(mydf, id.vars = "id")
x$time <- ave(x$id, x$id, FUN = seq_along)
dcast(x, id ~ time, value.var = "value")