Даты не сохраняют указанный формат в кадре данных R

Проще говоря, я беру даты событий, которые соответствуют определенным условиям в df1, и помещаю их в новый фрейм данных (df2). Форматирование дат в df2 должно быть таким же, как и в df1 ("2000-09-12" или %Y-%m-%d). Однако даты в df2 читаются как «11212», «11213» и т. д.

для генерации данных:

"Date"<-c("2000-09-08", "2000-09-11","2000-09-12","2000-09-13","2000-09-14","2000-09-15","2000-09-18","2000-09-19","2000-09-20","2000-09-21", "2000-09-22","2000-09-25")
"Event"<-c("A","N","O","O","O","O","N","N","N","N","N","A")
df1<-data.frame(Date,Event)
df1
         Date Event
1  2000-09-08     A
2  2000-09-11     N
3  2000-09-12     O
4  2000-09-13     O
5  2000-09-14     O
6  2000-09-15     O
7  2000-09-18     N
8  2000-09-19     N
9  2000-09-20     N
10 2000-09-21     N
11 2000-09-22     N
12 2000-09-25     A

вот код:

"df2"<-data.frame()
"tmp"<-data.frame(1,2)
i<-c(1:4)
for (x in i)
  {
  date1<- df1$Date[df1$Event=="O"][x]
  date2<- df1$Date[df1$Event=="A" & df1$Date => date1] [1]
  as.numeric(difftime(date2, date1))->tmp[1,2]
  as.Date(as.character(df1$Date[df1$Event=="O"][x]), "%Y-%m-%d")->tmp[1,1] ##the culprit
  rbind(df2, tmp)->df2
}

Выход цикла выглядит так:

     X1 X2
1 11212 13
2 11213 12
3 11214 11
4 11215 10

Я хочу, чтобы это выглядело так:

            X1 X2
1 "2000-09-12" 13
2 "2000-09-13" 12
3 "2000-09-14" 11
4 "2000-09-14" 10

person Kirsten    schedule 16.03.2017    source источник
comment
С этим будет трудно помочь, если вы не предоставите полностью воспроизводимый пример.   -  person joran    schedule 16.03.2017
comment
обновит вопрос с некоторыми данными   -  person Kirsten    schedule 16.03.2017
comment
хм, простое преобразование числового ввода в дату должно работать правильно? например, as.Date(11212)   -  person timfaber    schedule 16.03.2017
comment
@timfaber: этот код выдает ошибку в as.Date.numeric(11212): необходимо указать «происхождение»   -  person Kirsten    schedule 16.03.2017
comment
as.Date(11212, origin="1970-01-01") это то, что вы хотите. Дополнительную информацию см. в разделе сведений в разделе ?as.Date.   -  person lmo    schedule 16.03.2017
comment
stackoverflow.com/ вопросы/31274536/   -  person timfaber    schedule 16.03.2017


Ответы (1)


Если я правильно понимаю, ОП хочет найти для каждого события "O" разницу в днях до следующего следующего события "A".

Эту проблему можно решить с помощью скользящего соединения. Мы извлекаем события "O" и события "A" в две отдельные таблицы данных и объединяем их в date.

Это позволит избежать всех хлопот с форматом данных и работает также, если df1 не еще не заказано Date.

library(data.table)
setDT(df1)[Event == "A"][df1[Event == "O"], 
                         on = "Date", roll = -Inf, .(Date, x.Date - i.Date)]
         Date      V2
1: 2000-09-12 13 days
2: 2000-09-13 12 days
3: 2000-09-14 11 days
4: 2000-09-15 10 days

Обратите внимание, что roll = -Inf откатывается назад (следующее наблюдение переносится назад (NOCB)), потому что требуется дата следующего события "A".

Данные

Date <- as.Date(c("2000-09-08", "2000-09-11","2000-09-12","2000-09-13","2000-09-14","2000-09-15",
                  "2000-09-18","2000-09-19","2000-09-20","2000-09-21", "2000-09-22","2000-09-25"))
Event <- c("A","N","O","O","O","O","N","N","N","N","N","A")
df1 <- data.frame(Date,Event)
person Uwe    schedule 20.07.2018