Id和代码组合的最早日期

时间:2015-03-28 05:57:48

标签: r

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

   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和Code NFS的最早日期是2011-05-27,因此Early_NFS_DATE列应包含日期2011-05-27。

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

Id 1355只包含一个代码CSX,ID 1355和Code 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         . 

需要帮助。

1 个答案:

答案 0 :(得分:2)

您可以这样做:

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将数据放入宽幅格式,但此变换日期为数字。请注意在公式的2个术语中使用Code
  2. 这是将创建的数字日期转换为实际日期的第二步。
  3. 您可能需要额外的步骤来格式化结果(重命名列并更改缺失值..)

  4. 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>