Добавление одного дня при каждом изменении значения - PullRequest
0 голосов
/ 07 июня 2018

У меня есть таблица данных с миллионами строк в следующем формате.

Для каждого 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 голосов
/ 07 июня 2018

пробелы в датах - не проблема для этого решения:

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)
  }]
0 голосов
/ 07 июня 2018

Вы можете просто сделать это:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...