【问题标题】:How to count number of days between events in a dataset如何计算数据集中事件之间的天数
【发布时间】:2018-06-22 13:37:49
【问题描述】:

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

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

我希望它以这样的方式结束:

NewEvent = c(NA,NA,0,1,2,3,0,1,NA,0,1,2,3,0,1,0)
sample2 <- sample <- data.frame(Person,Day,NewEvent);sample2

我是 R 新手,不熟悉循环或 if 语句,而且我找不到已经回答此类问题的线程,因此非常感谢任何帮助。谢谢!

【问题讨论】:

  • 我很难理解这个问题。当您说计算事件之间发生的天数时,您的意思是在事件 0 和事件 1 和事件 NA 之间吗?另外,每个“人”是否代表一个人?如果是这样,你为什么不使用名字?
  • MKR 解决了我的问题。为了澄清我试图计算事件之间的天数(即当事件 = 1 时)。即使 Event 的值为 NA,计数也会继续。是的,“Person”指的是参与者 ID。

标签: r if-statement count


【解决方案1】:

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

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

注意:如果Day上的数据不是sorted,则应在上面的代码中添加arrange(Day)

【讨论】:

  • 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,2,1,NA,4,3,2,1,2,1,1) 它当 Event=1 时,不会将 NewEvent 的计数器重置为 0,但对于我的需要,这并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-25
  • 1970-01-01
  • 2021-11-06
  • 1970-01-01
  • 2017-08-11
  • 1970-01-01
  • 2012-07-24
相关资源
最近更新 更多