在每次更改值时添加一天

时间:2018-06-07 08:35:31

标签: r datatable

我有一个data.table,包含以下格式的数百万行。

每个ID有多年的结果,但我只知道一年中的一天从1到365或366.我不知道月份和年份,但我知道第一行的日期(例如1995/1/1)。

ID    DAY   ATRR1   ATRR2
 1      1     0.2     0.4
 2      1     1.2     0.5
 3      1     0.8     1.4
 1      2     1.3     1.5
 2      2     2.3     0.3
 3      2     1.7     1.3
 1      3     1.5     1.4
 2      3     2.1     1.3
 3      3     1.2     0.3
  ...
 1    365     1.5     1.4
 2    365     2.1     1.3
 3    365     1.2     0.3
 1      1     1.5     1.4
 2      1     2.1     1.3
 3      1     1.2     0.3
 1      2     1.3     1.5
 2      2     2.3     0.3
 3      2     1.7     1.3
  ...

我想添加DATE列,在DAY列的每次更改中添加一天,结果将是:

ID    DAY   ATRR1   ATRR2        DATE
 1      1     0.2     0.4    1995/1/1
 2      1     1.2     0.5    1995/1/1
 3      1     0.8     1.4    1995/1/1
 1      2     1.3     1.5    1995/1/2
 2      2     2.3     0.3    1995/1/2
 3      2     1.7     1.3    1995/1/2
 1      3     1.5     1.4    1995/1/3
 2      3     2.1     1.3    1995/1/3
 3      3     1.2     0.3    1995/1/3
  ...
 1    365     1.5     1.4  1995/12/31
 2    365     2.1     1.3  1995/12/31
 3    365     1.2     0.3  1995/12/31
 1      1     1.5     1.4    1996/1/1
 2      1     2.1     1.3    1996/1/1
 3      1     1.2     0.3    1996/1/1
 1      2     1.3     1.5    1996/1/2
 2      2     2.3     0.3    1996/1/2
 3      2     1.7     1.3    1996/1/2
  ...

怎么可能这样做?

2 个答案:

答案 0 :(得分:1)

你可以这样做:

as.Date(x, origin="1994-12-31")

我的假设是你在日期中没有空白,并按照问题中的描述排列,否则会产生不良后果。

示例数据

df <- data.frame(Day = rep(c(1:365,1:2),each=3))

使用seq(行程编码)

创建rle这样的df$seq <- data.table::rleid(df$Day) df$date <- as.Date(df$seq, origin="1994-12-31") #final answer tail(df,8)
   > tail(df,8)
     Day seq       date
1094 365 365 1995-12-31
1095 365 365 1995-12-31
1096   1 366 1996-01-01
1097   1 366 1996-01-01
1098   1 366 1996-01-01
1099   2 367 1996-01-02
1100   2 367 1996-01-02
1101   2 367 1996-01-02

如果这是您的期望,请告诉我

示例输出:

<s:if test="%{#session.user.myLanguages != null}">
                          <s:select list="%{#session.user.myLanguages}"
                                      listKey="languageCode" listValue="languageName"
                                      value="%{#session.user.defaultOperaLanguage}/>
</s:if>

答案 1 :(得分:1)

日期差距对此解决方案没有问题:

library(data.table)
library(lubridate)
library(magrittr)

read.table(text = "
ID    DAY   ATRR1   ATRR2
1      1     0.2     0.4
2      1     1.2     0.5
3      1     0.8     1.4
1      2     1.3     1.5
2      2     2.3     0.3
3      2     1.7     1.3
1      3     1.5     1.4
2      3     2.1     1.3
3      3     1.2     0.3
1    365     1.5     1.4
2    365     2.1     1.3
3    365     1.2     0.3
1      1     1.5     1.4
2      1     2.1     1.3
3      1     1.2     0.3
1      2     1.3     1.5
2      2     2.3     0.3
3      2     1.7     1.3", header = T) %>% setDT -> x

x[, date := as.Date(DAY, origin = "1995-01-01") -1]
x[, date := {
  t1 = c(0, diff(DAY))
  t2 = ifelse(t1 < 0, 1, 0)
  t3 = cumsum(t2)
  t4 = date + years(t3)
  }]