首页 > 解决方案 > 对 R 中的连续值求和,按特定值分解

问题描述

我无法弄清楚如何对变量进行分组以从 dplyr 获得所需的结果。我有一个这样的实验数据集:

  subject   task_phase  block_number trial_number ResponseCorrect
   <chr>     <chr>              <dbl>        <dbl>           <dbl>
 1 268301377    1            1            2               1
 2 268301377    1            1            3               1
 3 268301377    1            1            4               1
 4 268301377    1            2            2              -1
 5 268301377    1            2            3               1
 6 268301377    1            2            4               1
 7 268301377    1            3            2               1
 8 268301377    1            3            3              -1
 9 268301377    1            3            4               1
10 268301377    2            1           50               1
11 268301377    2            1           51               1
12 268301377    2            1           52               1
13 268301377    2            2           37              -1
14 268301377    2            2           38               1
15 268301377    2            2           39               1
16 268301377    2            3           41              -1
17 268301377    2            3           42              -1
18 268301377    2            3           43               1

我希望总结连续的“正确”响应,并在每次出现错误响应时都“重置”这个计数:

  subject   task_phase  block_number trial_number ResponseCorrect   ConsecutiveCorrect
   <chr>     <chr>              <dbl>        <dbl>       <dbl>            <dbl>
 1 268301377    1            1            1               1                 1
 2 268301377    1            1            2               1                 2
 3 268301377    1            1            3               1                 3
 4 268301377    1            2            1              -1                 0
 5 268301377    1            2            2               1                 1
 6 268301377    1            2            3               1                 2
 7 268301377    1            3            1               1                 1
 8 268301377    1            3            2              -1                 0
 9 268301377    1            3            3               1                 1
10 268301377    2            1            1               1                 1
11 268301377    2            1            2               1                 2
12 268301377    2            1            3               1                 3
13 268301377    2            2            1              -1                 0
14 268301377    2            2            2               1                 1
15 268301377    2            2            3               1                 2
16 268301377    2            3            1              -1                 0
17 268301377    2            3            2              -1                 0
18 268301377    2            3            3               1                 1

我最初认为我可以做一些类似的事情df %>% group_by(subject, task_phase, block_number, ResponseCorrect) %>% mutate(ConsecutiveCorrect = cumsum(ResponseCorrect),并且几乎可以工作。但是,它没有给出连续的值:它只是总结了每个块的正确响应总数(。我实际上是在尝试使用 -1s 作为重新开始求和的断点。

是否有我不知道的分组功能(Tidyverse 或其他)可以按照这些方式做一些事情?

标签: rdplyrtidyverse

解决方案


你可以试试

library(dplyr)

data %>% 
  group_by(
    subject, 
    task_phase, 
    block_number, 
    grp = lag(cumsum(ResponseCorrect == -1), default = 0)
    ) %>% 
  mutate(ConsecutiveCorrect = ifelse(ResponseCorrect == -1, 0, cumsum(ResponseCorrect))) %>% 
  ungroup() %>% 
  select(-grp)

返回

# A tibble: 18 x 6
     subject task_phase block_number trial_number ResponseCorrect ConsecutiveCorrect
       <dbl>      <dbl>        <dbl>        <dbl>           <dbl>              <dbl>
 1 268301377          1            1            2               1                  1
 2 268301377          1            1            3               1                  2
 3 268301377          1            1            4               1                  3
 4 268301377          1            2            2              -1                  0
 5 268301377          1            2            3               1                  1
 6 268301377          1            2            4               1                  2
 7 268301377          1            3            2               1                  1
 8 268301377          1            3            3              -1                  0
 9 268301377          1            3            4               1                  1
10 268301377          2            1           50               1                  1
11 268301377          2            1           51               1                  2
12 268301377          2            1           52               1                  3
13 268301377          2            2           37              -1                  0
14 268301377          2            2           38               1                  1
15 268301377          2            2           39               1                  2
16 268301377          2            3           41              -1                  0
17 268301377          2            3           42              -1                  0
18 268301377          2            3           43               1                  1

推荐阅读