我有一个数据集,其中有事件发生的二进制指示符.从此列表中,我想创建未发生事件的连续时间步数的计数.例如(TS =时间步,EV =事件指示符,C =计数):

TS1 -> TS2 -> TS3 -> TS4 -> TS5 ->...

EV0 -> EV0 -> EV1 -> EV0 -> EV0 ->...

C0 -> C1 -> C0 -> C0 -> C1 ->...

作为一个例子,请考虑:

labs <- c("A", "A", "A", "A", "B", "B", "B", "B", "C", "C", "C", "C", "D", "D", "D", "D", "D")
time <- c(1,2,3,4 ,1,2,3,4 ,1,2,3,4 ,1,2,3,4,5)
event <- c(0,0,0,0, 0,1,0,0, 1,1,0,0, NA,0,0,1,0)
desiredOutcome <- c(0,1,2,3,0,0,0,1,0,0,0,1,NA,0,1,0,0) # goal

exDF <- data.frame(labs,time, event, desiredOutcome)

从最终目标和收件箱,我最终得到了以下代码:

library(dplyr)

exDF <- exDF %>%
  group_by(labs) %>%
  mutate(pe1 = lag(event, order_by=time)) # create new variable for prior event


exDF$count2 <- ifelse(
  ((exDF$pe1 == 1) & (exDF$event == 0)), # condition checks for rows where previous timestep is included & had event WHERE event is not ongoing in this timestep
  0, # True val
  NA) # False val


exDF$count <- ifelse(
  (is.na(exDF$pe1) & (exDF$event == 0)), # condition checks for rows where previous timestep is not included & no current event
  0, # True val
  exDF$count2) # False val

它似乎正确地填写了所有零.但是,我不知道有一种好方法可以从填充适当的0和用NA填充的其他值达到我想要的结果.

我的大部分实验都与组合Mutations 和滞后有关,但它们只会导致填写下一组值(如果零在输入列中,则会单独显示一;如果是一,那么是二).下面的示例不try 处理计数的重置,而是导致上述行为:

exDF <- exDF %>%
  group_by(labs) %>%
  mutate(countFinal = lag(count, order_by=time) + 1) 

因此,我的挑战与事情解决的顺序有关.使用类似于这里的Mutate命令的命令,顺序似乎是:

Pull all cell values by label -> Look at their lags -> Add 1 -> Done, but incorrectly

当我需要它是这样的:

Pull first cell value by label -> Look at lag -> Add 1 or reset -> Pull second cell (filled in prior step) value by label -> Look at their lags -> Add 1 or reset -> Pull third... -> Done

有什么好方法可以用现有的包做到这一点吗?

推荐答案

想不出更直接的方法,但这有效.工作流程:

  1. 创建事件副本(mp)并用唯一值替换NA,例如2
  2. for each 事件分组提供唯一的ID
  3. replace()每个事件分组中的第一个值为零,并将剩余的非零组ID值更改为1
  4. 返回mp列累计和
  5. desiredOutcome列中应不适用的正确值
library(dplyr)

exDF |>
  group_by(labs) %>%
  mutate(tmp = if_else(is.na(event), 2, event),
         tmp = cumsum(tmp != lag(tmp, default = 1))) |>
  group_by(labs, tmp) |>
  mutate(tmp = replace(tmp, 1, 0),
         tmp = if_else(tmp != 0, 1, 0),
         tmp = cumsum(tmp),
         desiredOutcome = if_else(is.na(event), NA, desiredOutcome)) |>
  ungroup() |>
  select(-tmp)
         
# # A tibble: 17 × 4
#    labs   time event desiredOutcome
#    <chr> <dbl> <dbl>          <dbl>
#  1 A         1     0              0
#  2 A         2     0              1
#  3 A         3     0              2
#  4 A         4     0              3
#  5 B         1     0              0
#  6 B         2     1              0
#  7 B         3     0              0
#  8 B         4     0              1
#  9 C         1     1              0
# 10 C         2     1              0
# 11 C         3     0              0
# 12 C         4     0              1
# 13 D         1    NA             NA
# 14 D         2     0              0
# 15 D         3     0              1
# 16 D         4     1              0
# 17 D         5     0              0   

R相关问答推荐

如何通过r中每20滚动和来创建组将数据视为1:10

pivot_longer:names_to和names_pattern

如何将log 2刻度上的数字转换为自然log

按条件计算观察次数

以R表示的gglikert地块调整总数

从R导出全局环境中的所有sf(numrames)对象

在"gt"表中添加第二个"groupname_col",而不连接列值

用预测NLS处理R中生物学假设之上的误差传播

S用事件解决物质平衡问题

使用外部文件分配变量名及其值

在R函数中使用加号

识别连接的子网(R-igraph)

从R中发出的咕噜声中的BUG?

提高圣彼得堡模拟的速度

'使用`purrr::pwalk`从嵌套的嵌套框架中的列表列保存ggplots时出现未使用的参数错误

将具有坐标列表列的三角形转换为多个多边形

我如何使用循环来编写冗余的Rmarkdown脚本?

如何显示准确的p值而不是<;0.001*?

ggplot斜体轴刻度标签中的单个字符-以前的帖子建议不工作

具有自定义仓位限制和计数的GGPLATE直方图