【问题标题】:earliest date for a combination of Id and codeId 和代码组合的最早日期
【发布时间】:2015-03-28 05:57:47
【问题描述】:

我有一个如下所示的数据集

   Id        Date        Code
   1232      2011-05-27  NFS
   1323      2012-02-12  NFS
   1355      2009-12-11  CSX
   1221      2011-10-17  WBT
   1232      2004-06-05  CSX
   1355      2007-08-15  CSX

目标是创建三个日期列,每个代码 {Early_NFS_DATE, Early_CSX_DATE, Early_WBT_DATE} 一个。这些日期列应存储每个 Id 和代码 的最早/最小日期,组合,例如:

Id 1232 包含两个代码 NFS 和 CSX。 ID 1232 和代码 NFS 的最早日期是 2011-05-27,因此 Early_NFS_DATE 列应包含日期 2011-05-27。

ID 1232 和代码 CSX 的最早日期是 2004-06-05,因此 Early_CSX_DATE 列应包含日期 2004-06-05。

ID 1355 仅包含一个代码 CSX,ID 1355 和代码 CSX 的最早日期为 2007-08-15,因此 Early_CSX_DATE 列应包含日期 2007-08-15...以此类推

输出应如下所示。

   Id        Date        Code    Early_NFS_DATE   Early_CSX_DATE     Early_WBT_DATE
   1232      2011-05-27  NFS     2011-05-27       2004-06-05         .
   1323      2012-02-12  NFS     2012-02-12       .                  .
   1355      2009-12-11  CSX     .                2007-08-15         . 
   1221      2011-10-17  WBT     .                .                  2011-10-17                                
   1232      2004-06-05  CSX     2011-05-27       2004-06-05         .
   1355      2007-08-15  CSX     .                2007-08-15         . 

需要帮助。

【问题讨论】:

  • 嗨,你的输出不清楚,因为你说 >,但 Early_NFS_DATEEarly_CSX_DATE 包含日期不对应Code列,那有什么意义呢?

标签: r


【解决方案1】:

例如,您可以这样做:

library(reshape2)
library(data.table)
dx$Date <- as.Date(dx$Date)
dx_w <- dcast(dx,Code+Id~Code,
      function(x) {if (length(x)>0) min(x) else NA_real_},value.var="Date")
setDT(dx_w)[,lapply(.SD,as.Date,origin="1970-01-01"),"Id,Code"]

#     Id Code        CSX        NFS        WBT
# 1: 1232  CSX 2004-06-05       <NA>       <NA>
# 2: 1355  CSX 2007-08-15       <NA>       <NA>
# 3: 1232  NFS       <NA> 2011-05-27       <NA>
# 4: 1323  NFS       <NA> 2012-02-12       <NA>
# 5: 1221  WBT       <NA>       <NA> 2011-10-17
  1. 使用dcast 将数据置于宽格式中,但这会将日期转换为数字。请注意在公式的两个术语中使用了Code
  2. 第二步,将创建的数字日期转换为实际日期。
  3. 您可能需要一个额外的步骤来格式化您的结果(重命名列和更改缺失值..)

data.table v 1.9.5,我们不需要加载reshape2dcast 保留属性(这消除了最后一步)。也就是说,

require(data.table) # v 1.9.5
setDT(dx)[, Date := as.Date(Date)]
dcast(dx, Id + Code ~ Code, fun=min, fill=NA, value.var="Date")
#      Id Code        CSX        NFS        WBT
# 1: 1221  WBT       <NA>       <NA> 2011-10-17
# 2: 1232  CSX 2004-06-05       <NA>       <NA>
# 3: 1232  NFS       <NA> 2011-05-27       <NA>
# 4: 1323  NFS       <NA> 2012-02-12       <NA>
# 5: 1355  CSX 2007-08-15       <NA>       <NA>

【讨论】:

  • @Arun 感谢您的编辑。当我尝试在寡妇上编写代码时,我收到此错误 Error in frankv(dat, cols = cols, ties.method = "dense") : Internal error: invalid ties.method for frankv() 。在我的 sessionInfo 中,我有:R version 3.1.2 (2014-10-31)-Platform: x86_64-w64-mingw32/x64 (64-bit)-other attached packages:[1] data.table_1.9.5
  • 我刚刚更新了我的 data.table 版本,然后才发表了我的最后一条评论。使用install_github("Rdatatable/data.table", build_vignettes = FALSE)。所以我想我已经有最后一次提交了。也许我应该更新我的 R 版本?
  • 嗯..奇怪。也许先卸载,然后重新安装并重试(这在某些情况下已解决问题)...我认为 R 版本不应该相关。
  • @Arun 这并没有解决问题。即使对于小插图代码,当我测试`DT Argument 'verbose' should be logical TRUE/FALSE。当我设置详细参数时同样的错误。等我有时间再仔细看看。
  • 谢谢。我也会在 Windows 上测试。我已经修复了一些来自 Windows 用户的错误报告,但这个从未出现过…… PS:不要加载 reshape2。如果是,请在加载 data.table 之前加载它。
猜你喜欢
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-18
  • 2018-10-13
  • 1970-01-01
相关资源
最近更新 更多