【发布时间】:2016-05-02 05:18:00
【问题描述】:
我处理的数据中的一项常见任务是将客户端数据从长数据改写为宽数据。我有一个使用下面概述的 Reshape 来执行此操作的过程,该过程基本上创建了新的(但未修改的)列,并附加了数字索引。就我而言,我不想对数据进行任何修改。我的问题是,因为我经常将 reshape2 用于其他操作,所以如何使用 dcast 来完成?例如,示例数据似乎不需要通过 id 来融合,但我不确定如何将其扩展。任何人都可以在 reshape2 中提供代码以在下面的示例中生成与“宽”相当的框架吗?
谢谢。
示例
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")
【问题讨论】:
-
目前需要运行两次(有一个初始错误,大多数 R-newbs 会发现与“闭包”有关,因为对象
df是 F 密度函数在R中。第二次出现df-data-object,所以没有发生错误。(我只制作了一个30行矩阵。) -
你是对的,感谢您指出这一点。我更新了代码以修复错误。