我有一个如下所示的数据集
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 .
需要帮助。
答案 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
dcast
将数据放入宽幅格式,但此变换日期为数字。请注意在公式的2个术语中使用Code
。从data.table v 1.9.5
开始,我们不需要加载reshape2
和dcast
保留属性(这取消了最后一步)。也就是说,
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>