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