基于两个变量的条件行计数 (R)

Conditional row count based on two variables (R)

我现在有一个问题无法解决。我有一个看起来像这样的大型数据框:

df <- data.frame( 
         Marker = c("", "", "", "start_tone", "", "", "start_trial", "", "", "", "", "", "", "", "start_tone", "", "", "", "start_trial", "", "", "", "", "", ""), 
         size=c(3, NA, -1, -1, 4, -1, -1 , 3.5, -1, -1, 4, -1, -1, NA, 4, -1, -1, 2, -1, -1, -1, -1, -1, 4.5, -1))

df

我想要的是计算从“start_trial”标记开始的样本数。我希望这个计数在负值和正值两个方向上。此外,我希望负计数在“start_tone”标记之前停止 n 数量的样本(比如 2)。在正方向上,我希望该计数在下一个“start_tone”标记(负数开始的地方)之前停止 n(此处为 2)个样本。最后,我想要一个新专栏来跟踪每个“start_trial”标记周围的试验。因此,它应该类似于以下内容:

df2 <- data.frame(SampleCount = c("", -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6), 
         Marker = c("", "", "", "start_tone", "", "", "start_trial", "", "", "", "", "", "", "", "start_tone", "", "", "", "start_trial", "", "", "", "", "", ""), 
         size=c(3, NA, -1, -1, 4, -1, -1 , 3.5, -1, -1, 4, -1, -1, NA, 4, -1, -1, 2, -1, -1, -1, -1, -1, 4.5, -1),
         trial=c("", "trial 1", "trial 1", "trial 1", "trial 1", "trial 1", "trial 1", "trial 1", "trial 1", "trial 1", "trial 1", "trial1", "trial 2", "trial 2", "trial 2", "trial 2", "trial 2", "trial 2", "trial 2", "trial 2", "trial 2", "trial 2", "trial 2", "trial 2", "trial 2" ))

df2

非常感谢您的帮助!

使用 cumsumlead 创建组,然后使用 row_number 创建样本计数:

df %>% 
  group_by(trial = cumsum(lead(Marker, 2, default = "") == "start_tone")) %>% 
  mutate(n = ifelse(any(Marker == "start_trial"), row_number()[Marker == "start_trial"], NA),
         sampleCount = row_number() - n) 

输出

   Marker         size trial     n sampleCount
   <chr>         <dbl> <int> <int>       <int>
 1 ""              3       0    NA          NA
 2 ""             NA       1     6          -5
 3 ""             -1       1     6          -4
 4 "start_tone"   -1       1     6          -3
 5 ""              4       1     6          -2
 6 ""             -1       1     6          -1
 7 "start_trial"  -1       1     6           0
 8 ""              3.5     1     6           1
 9 ""             -1       1     6           2
10 ""             -1       1     6           3
11 ""              4       1     6           4
12 ""             -1       1     6           5
13 ""             -1       2     7          -6
14 ""             NA       2     7          -5
15 "start_tone"    4       2     7          -4
16 ""             -1       2     7          -3
17 ""             -1       2     7          -2
18 ""              2       2     7          -1
19 "start_trial"  -1       2     7           0
20 ""             -1       2     7           1
21 ""             -1       2     7           2
22 ""             -1       2     7           3
23 ""             -1       2     7           4
24 ""              4.5     2     7           5
25 ""             -1       2     7           6