在R中逐行减去

时间:2013-10-19 23:24:52

标签: r

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

数据集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的新手并尝试绕着数据集工作。我花了一整天努力让这个工作,但我不能。如果有人能看看并帮助我,我将不胜感激。

2 个答案:

答案 0 :(得分: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应该是您想要的,只是不确定您的描述中的哪一个。)

答案 1 :(得分: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