R-使用多个事件类型和ID计算自上次事件以来经过的时间
以前也曾问过类似的问题,问题是如何计算事件发生后的观察次数。我还有一个要求。如何计算自同一类型观察以来的天数,以及自任何其他类型事件以来的天数。我也有身份证 如需说明,请参见下文。我试图用Datatables在R中实现这一点,但收效甚微 我所拥有的:R-使用多个事件类型和ID计算自上次事件以来经过的时间,r,loops,datatables,R,Loops,Datatables,以前也曾问过类似的问题,问题是如何计算事件发生后的观察次数。我还有一个要求。如何计算自同一类型观察以来的天数,以及自任何其他类型事件以来的天数。我也有身份证 如需说明,请参见下文。我试图用Datatables在R中实现这一点,但收效甚微 我所拥有的: date event id 2000-07-06 2 1 2000-07-07 1 1 2000-07-09 0 1 2000-07-10 0 1 2000-07-15 2 1 200
date event id
2000-07-06 2 1
2000-07-07 1 1
2000-07-09 0 1
2000-07-10 0 1
2000-07-15 2 1
2000-07-16 1 1
2000-07-20 0 1
2000-07-21 1 1
2000-07-06 1 2
2000-07-07 2 2
2000-07-15 0 2
2000-07-16 0 2
2000-07-17 2 2
2000-07-18 1 2
我想要的是:
date event id days_since_event_1 days_since_event_2
2000-07-06 2 1 NA NA
2000-07-07 1 1 NA 1
2000-07-09 0 1 2 3
2000-07-10 0 1 3 4
2000-07-15 2 1 8 9
2000-07-16 1 1 9 1
2000-07-20 0 1 4 5
2000-07-21 1 1 5 6
2000-07-06 1 2 NA NA
2000-07-07 2 2 1 NA
2000-07-15 0 2 9 8
2000-07-16 0 2 10 9
2000-07-17 2 2 11 10
2000-07-18 1 2 12 1
这两个事件是相互排斥的,也就是说,它们不能在同一天发生。
希望听到一些好的建议。祝你一切顺利 您可以使用特定的事件编码对所有日期进行子集,例如:
date.2 = DATAFRAME[which(DATAFRAME[,2]==2),1]
然后就这么做
DATAFRAME[which(DATAFRAME[,2]==2),5] = as.numeric(diff.Date(date.2))
等等。
也许这更容易做到,但这是我想到的第一件事。
DATAFRAME只是这里的DATAFRAME的名称
编辑:如果我没看错的话,您希望在ID和事件列彼此不同的地方使用NAs吗?然后你可以继续:
DATAFRAME[which(DATAFRAME[,2]!=DATAFRAME[,3]),c(4,5)]=NA或类似的东西下面使用
Chron
库来计算日期差异
library(chron)
df$date <- chron(as.character(df$date),format=c(date="y-m-d"))
for(j in unique(df$id)){
DaysSince1 <-NA
DaysSince2 <-NA
RowsWithID <- grep(j,df$id)
for(i in RowsWithID){
df$days_since_event_1[i] <- df$date[i]-df$date[i-DaysSince1]
df$days_since_event_2[i] <- df$date[i]-df$date[i-DaysSince2]
if(df$event[i]==1){DaysSince1<-1}
else{DaysSince1<-DaysSince1+1}
if(df$event[i]==2){DaysSince2<-1}
else{DaysSince2<-DaysSince2+1}
}
}
要处理您的评论,您可以在
Base R
中执行以下操作,以获得观察次数而不是天数。不需要图书馆
for(j in unique(df$id)){
ObsSince1 <-NA
ObsSince2 <-NA
RowsWithID <- grep(j,df$id)
for(i in RowsWithID){
df$Obs_since_event_1[i] <- ObsSince1
df$Obs_since_event_2[i] <- ObsSince2
if(df$event[i]==1){ObsSince1<-1}
else{ObsSince1<-ObsSince1+1}
if(df$event[i]==2){ObsSince2<-1}
else{ObsSince2<-ObsSince2+1}
}
}
您好,是的,NAs将发生,因为该ID没有之前的事件。我意识到我输入的问题错误,我不需要观察之间的天数,而是每个事件之间的观察次数。谢谢您的回答。我现在发现,我实际上对每个事件之间的天数不感兴趣,而是对观察次数感兴趣。你有办法吗?或者,这可能只是要在stack exchange上发布的另一个问题。我已经编辑了我的回答,为您的新问题添加了一个“修复”。如果您的需求符合要求,请考虑将标记标记为“回答”。
for(j in unique(df$id)){
ObsSince1 <-NA
ObsSince2 <-NA
RowsWithID <- grep(j,df$id)
for(i in RowsWithID){
df$Obs_since_event_1[i] <- ObsSince1
df$Obs_since_event_2[i] <- ObsSince2
if(df$event[i]==1){ObsSince1<-1}
else{ObsSince1<-ObsSince1+1}
if(df$event[i]==2){ObsSince2<-1}
else{ObsSince2<-ObsSince2+1}
}
}
> df
date event id Obs_since_event_1 Obs_since_event_2
1 2000-07-06 2 1 NA NA
2 2000-07-07 1 1 NA 1
3 2000-07-09 0 1 1 2
4 2000-07-10 0 1 2 3
5 2000-07-15 2 1 3 4
6 2000-07-16 1 1 4 1
7 2000-07-20 0 1 1 2
8 2000-07-21 1 1 2 3
9 2000-07-06 1 2 NA NA
10 2000-07-07 2 2 1 NA
11 2000-07-15 0 2 2 1
12 2000-07-16 0 2 3 2
13 2000-07-17 2 2 4 3
14 2000-07-18 1 2 5 1