1

简而言之,我在 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
4

1 回答 1

0

如果我理解正确,OP 希望为每个"O"事件找到下一个事件的天数差异"A"

这可以使用滚动连接来解决。我们将"O"事件和"A"事件提取到两个单独的 data.tables 中,并在 上加入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)
于 2018-07-20T10:32:50.253 回答