R 如何计算数据集中事件之间的天数

R 如何计算数据集中事件之间的天数,r,if-statement,count,R,If Statement,Count,我正在尝试重新构造数据以重新编码变量(“事件”),以便确定事件之间的天数。基本上,我希望能够计算事件之间发生的天数。重要的是,我只想在每个人的第一个事件发生后开始事件之间的“计数”。以下是一个示例数据帧: Day = c(1:8,1:8) Event = c(0,0,1,NA,0,0,1,0,0,1,NA,NA,0,1,0,1) Person = c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2) sample <- data.frame(Person,Day,Event

我正在尝试重新构造数据以重新编码变量(“事件”),以便确定事件之间的天数。基本上,我希望能够计算事件之间发生的天数。重要的是,我只想在每个人的第一个事件发生后开始事件之间的“计数”。以下是一个示例数据帧:

Day = c(1:8,1:8)
Event = c(0,0,1,NA,0,0,1,0,0,1,NA,NA,0,1,0,1)
Person = c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2)
sample <- data.frame(Person,Day,Event);sample
Day=c(1:8,1:8)
事件=c(0,0,1,NA,0,0,1,0,0,1,NA,NA,0,1,0,1)
Person=c(1,1,1,1,1,1,1,2,2,2,2,2,2,2)

样本一种方法是对
人员进行分组,并通过
cumsum(Event==1)
计算事件的不同发生率。现在,对
Person
grp
进行分组,计算不同事件发生后经过的天数。解决办法如下:

library(dplyr)

sample %>% group_by(Person) %>%
  mutate(EventNum = cumsum(!is.na(Event) & Event == 1)) %>%
  group_by(Person, EventNum) %>%
  mutate(NewEvent = ifelse(EventNum ==0, NA, row_number() - 1)) %>%
  ungroup() %>%
  select(Person, Day, NewEvent) %>%
  as.data.frame()


#    Person Day NewEvent
# 1       1   1       NA
# 2       1   2       NA
# 3       1   3        0
# 4       1   4        1
# 5       1   5        2
# 6       1   6        3
# 7       1   7        0
# 8       1   8        1
# 9       2   1       NA
# 10      2   2        0
# 11      2   3        1
# 12      2   4        2
# 13      2   5        3
# 14      2   6        0
# 15      2   7        1
# 16      2   8        0

注意:如果数据未在
日期
排序
,则应在上述代码中添加
安排(日期)

我很难理解这个问题。当您说计算事件之间发生的天数时,您是指事件0和事件1以及事件NA之间的天数吗?此外,每个“人”是否代表一个人?如果是这样,为什么不使用名称?MKR解决了我的问题。为了澄清,我试图计算事件之间的天数(即事件=1时)。即使在事件的值为NA的天数内,计数仍将继续。是的,“Person”指的是一个参与者ID.MKR——我想知道是否有一种简单的方法来重新构造变量(NewEvent),不是像您的解决方案那样按升序,而是按降序?所以NewEvent=c(NA,NA,0,3,2,1,0,1,NA,0,3,2,1,0,1,0)@leary9009是的。您可以使用
ifelse
简单地将行更改为
mutate(NewEvent=ifelse(EventNum==0,NA,n()-row_number())
,它将完成此操作。再次感谢!你的建议对我不太管用,但为了达到我的目的,我对你的代码做了一个小小的修改:mutate(NewEvent=ifelse(EventNum==0,NA,n()-(row_number()-1))%>%这会导致以下结果:NewEvent=c(NA,NA,4,3,2,1,1,NA,4,3,2,1),当Event=1时,它不会将NewEvent的计数器重置为0,但为了我的需要,这并不重要。
library(dplyr)

sample %>% group_by(Person) %>%
  mutate(EventNum = cumsum(!is.na(Event) & Event == 1)) %>%
  group_by(Person, EventNum) %>%
  mutate(NewEvent = ifelse(EventNum ==0, NA, row_number() - 1)) %>%
  ungroup() %>%
  select(Person, Day, NewEvent) %>%
  as.data.frame()


#    Person Day NewEvent
# 1       1   1       NA
# 2       1   2       NA
# 3       1   3        0
# 4       1   4        1
# 5       1   5        2
# 6       1   6        3
# 7       1   7        0
# 8       1   8        1
# 9       2   1       NA
# 10      2   2        0
# 11      2   3        1
# 12      2   4        2
# 13      2   5        3
# 14      2   6        0
# 15      2   7        1
# 16      2   8        0