【问题标题】:Reshape DF from long to wide in R using Reshape2 without an aggregation function在没有聚合函数的情况下使用 Reshape2 在 R 中将 DF 从长整形到宽
【发布时间】: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行矩阵。)
  • 你是对的,感谢您指出这一点。我更新了代码以修复错误。

标签: r reshape2


【解决方案1】:

我们可以使用来自data.tabledcast,它可以包含多个value.var 列。将 'data.frame' 转换为 'data.table' (setDT(df)),使用 dcast 和公式并指定 value.var

library(data.table)
dcast(setDT(df), id~gid, value.var=names(df)[2:6])

注意:与reshape2 相比,data.table 方法会更快

【讨论】:

  • 谢谢。我越来越想知道是否应该将我的批处理转移到 data.table ,因为这个包似乎有很多解决方案,而且它是各种帮手。目前看来,dcast 只会对一个值 var 执行我想要的操作,这意味着我需要先将它融化,看起来。再次感谢这种方法,我会试一试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 2012-10-01
  • 1970-01-01
  • 2015-08-08
  • 2013-04-08
  • 1970-01-01
相关资源
最近更新 更多