2013-10-19 40 views
-1

我有一个超过2000行,只有两列的数据集。我想从现有的日期列中创建两个新的间隔列。interdate1是两个日期和年份之间的差异,当年结束时。从下一年的0开始。虽然interdate2在遇到新的一年时不会重置为零而继续。在R中减行明智

数据集A是我目前读入R的数据,但数据集B是我想要的结果。

DatasetA 
date    cost 
3/20/1990   0.89 
3/21/1990   1.98 
3/22/1990   2.0 
6/24/1990   0.74 
1/18/1991   0.54 
1/20/1991   0.56 

预期结果

date    cost   interdate1 interdate2 
3/20/1990   0.89   0   0 
3/21/1990   1.98   1   1 
3/22/1990   2.0   1   1 
6/24/1990   0.74   2   2 
1/18/1991   0.54   0   189 
1/20/1991   0.56   2   190 

请我是新来的R和努力工作,我周围的数据集的方式。我花了整整一天的时间试图让这个工作,但我不能。如果有人能够看一眼并帮助我,请我感激。

+0

您确定您的输入数据正确吗?不应该将第4行的日期设置为'“3/24/1990”'而不是interdate2的最后两行是'300'和'302'?如果不是,我不知道你在说什么。 –

+0

@ SimonO101那些不是我正在使用的原始数据集。但他们是这种形式,我相信你明白我的问题是什么。谢谢 – user18143

+0

不,没有真实数据就不明显。日差可能意味着两件事情:连续行之间的日数或第一行的天数。手动计算这些数据并更新您的问题应该不会太困难。这将澄清任何疑问。 – flodel

回答

0
df1$date<-as.Date(df1$date,"%m/%d/%Y") 
    df1$interdate2<-df1$date - df1$date[1] 
x<-as.Date("1/01/1991","%m/%d/%Y") 
df1$interdate1<-with(df1,ifelse(date<x,date-date[1],date-date[5])) 

> df1 
     date cost interdate2 interdate1 
1 1990-03-20 0.89  0 days   0 
2 1990-03-21 1.98  1 days   1 
3 1990-03-22 2.00  2 days   2 
4 1990-06-24 0.74 96 days   96 
5 1991-01-18 0.54 304 days   0 
6 1991-01-20 0.56 306 days   2 
+0

我觉得'df1 $ interdate2'应该只是'df1 $ date - df1 $ date [1]'。 –

+0

谢谢。我尝试了你建议的代码,但是我得到了以下错误消息“r [i1] -r [-length(r):-(length(r) - lag + 1L]中的错误: – user18143

+0

@alexis_laz:谢谢。 – Metrics

1

大概就是这个样子(但你必须由西蒙指出的未解决的问题)

padded.diff <- function(x) c(0L, diff(x)) 

within(DatasetA, { 
    date  <- as.Date(date, "%m/%d/%Y") 
    date.int <- as.integer(date) 
    interdate2b <- date.int - date.int[1] 
    interdate2a <- padded.diff(date.int) 
    interdate1 <- ave(date.int, format(date, "%Y"), FUN = padded.diff) 
    date.int <- NULL # do not report 
}) 

(我认为interdate2ainterdate2b应该是你想要的,只是不知道哪一个,从你的描述。 )

+0

如果我为interdate1在重新设置零时遇到新的一年,那么它只是减去以前的日期,并继续例如从12/31/1990移动到01/03/1991,而不是从1991年的0开始计数与12/03/91和01/03/1991之间的差异,并返回值3. – user18143

+0

刚刚描述的是我的'interdate2a'。 – flodel

+0

interdate1和interdate2a产生类似的输出 – user18143