我正在尝试计算一个以其他变量为条件的运行计数(即累积总和),并且可以为另一个变量的特定值重置。我在 R 中工作,如果可能的话,我更喜欢基于 dplyr 的解决方案。

我想基于以下算法为运行计数创建一个变量 cumulative :

  • 计算 cumulativeid
  • 组合内的运行计数( age )
  • 对于每个后续 cumulative 将运行计数 ( trial ) 递增 1,其中 accuracy = 0block = 2condition = 1
  • 将每个 cumulative 的运行计数 ( trial ) 重置为 0,其中 accuracy = 1block = 2condition = 1 ,并且下一个增量从 1(不是前一个数字)恢复
  • 对于每个 trial ,其中 block != 2condition != 1 ,将运行计数( cumulative )保留为 NA

  • 这是一个最小的工作示例:
    mydata <- data.frame(id = c(1,1,1,1,1,1,1,1,1,1,1),
                     age = c(1,1,1,1,1,1,1,1,1,1,2),
                     block = c(1,1,2,2,2,2,2,2,2,2,2),
                     trial = c(1,2,1,2,3,4,5,6,7,8,1),
                     condition = c(1,1,1,1,1,2,1,1,1,1,1),
                     accuracy = c(0,0,0,0,0,0,0,1,0,0,0)
    )
    
    id  age block   trial   condition   accuracy
    1   1   1       1       1           0
    1   1   1       2       1           0
    1   1   2       1       1           0
    1   1   2       2       1           0
    1   1   2       3       1           0
    1   1   2       4       2           0
    1   1   2       5       1           0
    1   1   2       6       1           1
    1   1   2       7       1           0
    1   1   2       8       1           0
    1   2   2       1       1           0
    

    预期的输出是:
    id  age block   trial   condition   accuracy    cumulative
    1   1   1       1       1           0           NA
    1   1   1       2       1           0           NA
    1   1   2       1       1           0           1
    1   1   2       2       1           0           2
    1   1   2       3       1           0           3
    1   1   2       4       2           0           NA
    1   1   2       5       1           0           4
    1   1   2       6       1           1           0
    1   1   2       7       1           0           1
    1   1   2       8       1           0           2
    1   2   2       1       1           0           1
    

    最佳答案

    我们可以使用 case_when 根据我们的条件分配我们需要的值。然后我们添加一个额外的 group_by 条件,当 cumsum 列为 0 时,使用 temp 来切换值。在最后的 mutate 步骤中,我们暂时将 replace 中的 NA temp 值设为 0,然后将 cumsum 覆盖并放回 NA 值以再次到位最终输出。

    library(dplyr)
    
    mydata %>%
        group_by(id, age) %>%
        mutate(temp = case_when(accuracy == 0 & block == 2 & condition == 1 ~ 1,
                                accuracy == 1 & block == 2 & condition == 1 ~ 0,
                                TRUE ~ NA_real_)) %>%
        ungroup() %>%
        group_by(id, age, group = cumsum(replace(temp == 0, is.na(temp), 0))) %>%
        mutate(cumulative = replace(cumsum(replace(temp, is.na(temp), 0)),
                              is.na(temp), NA)) %>%
        select(-temp, -group)
    
    
    #    group    id   age block trial condition accuracy cumulative
    #   <dbl> <dbl> <dbl> <dbl> <dbl>     <dbl>    <dbl>      <dbl>
    # 1     0     1     1     1     1         1        0         NA
    # 2     0     1     1     1     2         1        0         NA
    # 3     0     1     1     2     1         1        0          1
    # 4     0     1     1     2     2         1        0          2
    # 5     0     1     1     2     3         1        0          3
    # 6     0     1     1     2     4         2        0         NA
    # 7     0     1     1     2     5         1        0          4
    # 8     1     1     1     2     6         1        1          0
    # 9     1     1     1     2     7         1        0          1
    #10     1     1     1     2     8         1        0          2
    #11     1     1     2     2     1         1        0          1
    

    关于r - 在 R (dplyr) 中重置的条件运行计数(累计和),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52960348/

    10-09 13:38