2014-11-20 45 views
1

我有一个数据帧的组织结构如下:R数据帧:转换绝对日期为1天多因素

Subject ID |  Collected Date  | Value 
3933332   9/14/2004 9:38   0.576 
3933332   9/15/2004 3:48   1.164 
3933332   9/17/2004 9:38   2.112 
3933332   9/21/2004 1:00   1.547 
6955455   5/12/2011 2:11   0.012 
6955455   5/13/2011 1:31   0.023 
6955455   5/14/2011 3:11   0.112 
6955455   5/17/2011 12:11   0.342 
...    ....      ... 

我需要的是:

Subject ID |  Day     | Value 
3933332   1      0.576 
3933332   2      1.164 
3933332   4      2.112 
3933332   8      1.547 
6955455   1      0.012 
6955455   2      0.023 
6955455   3      0.112 
6955455   6      0.342 
...    ....      ... 

编辑:澄清,新的主题ID有一个新的开始日期。

我知道我可以使用as.Date格式化日期(时间与我无关)。 下一步可能是使用plyr和/或应用函数来按主体ID拆分集合,但我不知道该怎么做。

你能帮我吗?

+0

什么将是,让你知道重新开始计数日期之间有什么不同?这个月是?那一年?都?还有别的吗? – n8sty 2014-11-21 00:08:40

+0

@ n8sty新主题ID – 2014-11-21 00:15:22

回答

4

这是一个想法。我不确定您的数据是如何组成的。因此,我决定 根据您上面的内容创建数据框。请注意0​​是characterfoo

library(dplyr) 

mutate(group_by(foo, ID), 
     Date = as.Date(Date, format = "%m/%d/%Y %H:%M"), 
     nDay = as.character(Date - Date[1] + 1)) 

#  ID  Date value nDay 
#1 3933332 2004-09-14 0.576 1 
#2 3933332 2004-09-15 1.164 2 
#3 3933332 2004-09-17 2.112 4 
#4 3933332 2004-09-21 1.547 8 
#5 6955455 2011-05-12 0.012 1 
#6 6955455 2011-05-13 0.023 2 
#7 6955455 2011-05-14 0.112 3 
#8 6955455 2011-05-17 0.342 6 

额外:这是我对上面的代码天真的翻译到data.table的想法。

DT = setDT(foo)[, Date := as.Date(Date, format = "%m/%d/%Y %H:%M")] 
DT[, nDay := as.character(Date - Date[1] + 1), by = ID] 

DATA

foo <- structure(list(ID = c(3933332, 3933332, 3933332, 3933332, 6955455, 
6955455, 6955455, 6955455), Date = c("9/14/2004 9:38", "9/15/2004 3:48", 
"9/17/2004 9:38", "9/21/2004 1:00", "5/12/2011 2:11", "5/13/2011 1:31", 
"5/14/2011 3:11", "5/17/2011 12:11"), value = c(0.576, 1.164, 
2.112, 1.547, 0.012, 0.023, 0.112, 0.342)), .Names = c("ID", 
"Date", "value"), row.names = c(NA, -8L), class = "data.frame") 
+0

对于提问者的数据框实际上是由相同的数据类型组成的可能性,您有什么估计? – 2014-11-21 00:18:24

+0

@BondedDust非常感谢您的评论。除非我们有'dput',否则很难知道原始数据是如何精确构成的。在这里,我的想法是通过手动输入数字来创建数据,以便我可以支持OP。如果您有任何修改意见,请告诉我。我很乐意为此工作。 :-) – jazzurro 2014-11-21 00:30:41

+0

对不起,如果你把我的评论作为批评在适当情况下代码的潜在价值。这只是我认为日期时间值更可能是一个因素,即使提问者已经找出如何编辑标题并解决分隔符问题。 – 2014-11-21 00:34:19