【问题标题】:cumsum by participant and reset on 0 R [duplicate]参与者的cumsum并在0 R上重置[重复]
【发布时间】:2021-09-13 16:39:20
【问题描述】:

我有一个如下所示的数据框。我需要将参与者的正确试验次数相加,并在计数器变为 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 时仍然不会重置计数器。如果有人对此有任何建议,将不胜感激,谢谢

【问题讨论】:

  • 试试df %&gt;% group_by(Participant, g = cumsum(Correct==0)) %&gt;% mutate(Count = cumsum(Correct)) %&gt;% select(-g)
  • 成功了,非常感谢您的建议!

标签: r dplyr cumsum splitstackshape


【解决方案1】:

这行得通吗?

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)
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多