以下是我的代码:

set.seed(23)
data_toy <- tibble(
  family_code = sample(factor(400:410),1000,T),
  event_type = factor(sample(c("sad","happy"),1000,
                replace = TRUE,prob = c(.2,.8))),
  score = sample(1:100,1000,TRUE)
) %>% mutate(score = if_else(event_type =="happy",NA,score)) %>% 
  arrange(family_code)

输出:

family_code event_type score
   <fct>       <fct>      <int>
 1 400         happy         NA
 2 400         happy         NA
 3 400         happy         NA
 4 400         happy         NA
 5 400         sad           57
 6 400         happy         NA
 7 400         happy         NA
 8 400         happy         NA
 9 400         happy         NA
10 400         sad           65

我想创建一个功能来统计每个家庭的快乐事件的数量,直到悲伤的事件.

在我分享的示例中,我想要的输出是:

family_code event_type score happy_counter
   <fct>       <fct>      <int>         <dbl>
 1 400         happy         NA            NA
 2 400         happy         NA            NA
 3 400         happy         NA            NA
 4 400         happy         NA            NA
 5 400         sad           57             4
 6 400         happy         NA            NA
 7 400         happy         NA            NA
 8 400         happy         NA            NA
 9 400         happy         NA            NA
10 400         sad           65             4
11 400         happy         NA            NA
12 400         happy         NA            NA
13 400         happy         NA            NA
14 400         happy         NA            NA
15 400         happy         NA            NA
16 400         happy         NA            NA
17 400         happy         NA            NA
18 400         happy         NA            NA
19 400         sad           79             8
20 400         sad           78             0

我的数据大约是.10K观测值.我try 了group_by次和nest_by次,但每次悲伤的事件发生后,我都很难将计数归零.

推荐答案

try

library(dplyr)
out <- data_toy %>%
   group_by(family_code, ind = consecutive_id(event_type)) %>% 
   mutate(n = n()) %>% 
   slice_head(n = 1) %>%
   group_by(family_code) %>%
   mutate(n = lag(n) * NA^(event_type == "happy")) %>%
   ungroup %>%
   select(ind, family_code, event_type, happy_counter = n) %>%
   left_join(data_toy %>% 
   mutate(ind = consecutive_id(event_type)), .) %>% 
   group_by(family_code, ind) %>% 
   mutate(happy_counter = happy_counter * (all(event_type == "sad") & 
     !duplicated(happy_counter))) %>%
   ungroup

-输出

head(out, 20)
# A tibble: 20 × 5
   family_code event_type score   ind happy_counter
   <fct>       <fct>      <int> <int>         <dbl>
 1 400         happy         NA     1            NA
 2 400         happy         NA     1            NA
 3 400         happy         NA     1            NA
 4 400         happy         NA     1            NA
 5 400         sad           57     2             4
 6 400         happy         NA     3            NA
 7 400         happy         NA     3            NA
 8 400         happy         NA     3            NA
 9 400         happy         NA     3            NA
10 400         sad           65     4             4
11 400         happy         NA     5            NA
12 400         happy         NA     5            NA
13 400         happy         NA     5            NA
14 400         happy         NA     5            NA
15 400         happy         NA     5            NA
16 400         happy         NA     5            NA
17 400         happy         NA     5            NA
18 400         happy         NA     5            NA
19 400         sad           79     6             8
20 400         sad           78     6             0

R相关问答推荐

判断字符串中数字的连续性

如何得到R中唯一的组合群?

是否可以创建一个ggplot与整洁判断的交互作用

在R中,如何将变量(A,B和C)拟合在同一列中,如A和B,以及A和C在同一面板中?

为什么我的基准测试会随着样本量的增加而出现一些波动?

如何删除最后一个可操作对象

基于数据集属性将科分配给物种

KM估计的差异:SvyKm与带权重的调查

从多个可选列中选取一个值到一个新列中

在R中,如何将误差条放置在堆叠的每个条上?

如何使用FormC使简单算术运算得到的数字是正确的?

使用gt_summary是否有一种方法来限制每个变量集进行配对比较?

使用来自嵌套列和非嵌套列的输入的PURRR:MAP和dplyr::Mariate

如何提取R中其他字符串和数字之间的字符串?

如何筛选截止年份之前最后一个测量年度的所有观测值以及截止年份之后所有年份的所有观测值

减少雨云面之间的间距并绘制所有统计数据点

如何更改包中函数中的参数?

如何用不同长度的向量填充列表?

以R表示的NaN值的IS.NA状态

如何在R中使用因子行求和?