0

我有一个如下所示的数据框。我需要将参与者的正确试验次数相加,并在计数器变为 0 时重置计数器。

Participant TrialNumber Correct 
      118           1       1     
      118           2       1     
      118           3       1     
      118           4       1     
      118           5       1     
      118           6       1     
      118           7       1     
      118           8       0     
      118           9       1     
      118          10       1     
      120           1       1     
      120           2       1     
      120           3       1     
      120           4       1     
      120           5       0     
      120           6       1     
      120           7       0     
      120           8       1     
      120           9       1     
      120          10       1     

我试过使用splitstackshape

df$Count <- getanID(cbind(df$Participant, cumsum(df$Correct)))[,.id]

但是当它达到 0 而不是参与者时,它会累积地总结正确的试验:

Participant TrialNumber Correct Count
      118           1       1     1
      118           2       1     1
      118           3       1     1
      118           4       1     1
      118           5       1     1
      118           6       1     1
      118           7       1     1
      118           8       0     2
      118           9       1     1
      118          10       1     1
      120           1       1     1
      120           2       1     1
      120           3       1     1
      120           4       1     1
      120           5       0     2
      120           6       1     1
      120           7       0     2
      120           8       1     1
      120           9       1     1
      120          10       1     1

然后我尝试使用dplyr

df %>% 
  group_by(Participant) %>%
  mutate(Count=cumsum(Correct)) %>%
  ungroup %>% 
  as.data.frame(df)
Participant TrialNumber Correct Count
      118           1       1     1
      118           2       1     2
      118           3       1     3
      118           4       1     4
      118           5       1     5
      118           6       1     6
      118           7       1     7
      118           8       0     7
      118           9       1     8
      118          10       1     9
      120           1       1     1
      120           2       1     2
      120           3       1     3
      120           4       1     4
      120           5       0     4
      120           6       1     5
      120           7       0     5
      120           8       1     6
      120           9       1     7
      120          10       1     8

这让我更接近,但当计数器变为 0 时仍然不会重置计数器。如果有人对此有任何建议,将不胜感激,谢谢

4

1 回答 1

0

这行得通吗?

library(dplyr)
library(data.table)
df %>% 
  mutate(grp = rleid(Correct)) %>%
  group_by(Participant, grp) %>%
  mutate(Count = cumsum(Correct)) %>%
  select(- grp)
# A tibble: 10 x 4
# Groups:   Participant, grp [6]
     grp Participant Correct Count
   <int> <chr>         <dbl> <dbl>
 1     1 A                 1     1
 2     1 A                 1     2
 3     1 A                 1     3
 4     2 A                 0     0
 5     3 A                 1     1
 6     3 B                 1     1
 7     3 B                 1     2
 8     4 B                 0     0
 9     5 B                 1     1
10     5 B                 1     2

玩具数据:

df <- data.frame(
  Participant = c(rep("A", 5), rep("B", 5)),
  Correct = c(1,1,1,0,1,1,1,0,1,1)
)
于 2021-09-13T16:52:17.433 回答