我使用的数据中的一项常见任务是将客户数据从长到大重塑。我有一个使用下面概述的Reshape执行此操作的过程,它基本上创建了一个附加了数字索引的新(但未修改)列。在我的情况下,我不想对数据进行任何修改。我的问题,因为我经常使用reshape2进行其他操作,这是如何用dcast完成的?例如,似乎示例数据不需要通过id进行融合,但我不确定如何将其扩展。是否有人能够在reshape2中提供代码以生成与" wide"相当的框架。在下面的例子中?
感谢。
date_up <- as.numeric(as.Date("1990/01/01"))
date_down <- as.numeric(as.Date("1960/01/01"))
ids <- data.frame(id=rep(1:1000, 3),site=rep(c("NMA", "NMB","NMC"), 1000))
ids <- ids[order(ids$id), ]
dates <- data.frame(datelast=runif(3000, date_down, date_up),
datestart=runif(3000, date_down, date_up),
dateend=runif(3000, date_down, date_up),
datemiddle=runif(3000, date_down, date_up))
dates[] <- lapply(dates[ , c("datestart", "dateend", "datemiddle")],
as.Date.numeric, origin = "1970-01-01")
df <- cbind(ids, dates)
# Make a within group index and reshape df
df$gid <- with(df, ave(rep(1, nrow(df)), df[,"id"], FUN = seq_along))
wide <- reshape(df, idvar = "id", timevar = "gid", direction = "wide")
答案 0 :(得分:2)
我们可以使用dcast
中的data.table
,value.var
可以使用多个setDT(df)
列。将'data.frame'转换为'data.table'(dcast
),使用公式value.var
并指定library(data.table)
dcast(setDT(df), id~gid, value.var=names(df)[2:6])
。
data.table
注意:与reshape2
AnyCPU
方法会更快