R-通过选择条纹的最大值汇总/折叠观测值

R-通过选择条纹的最大值汇总/折叠观测值,r,dplyr,R,Dplyr,我正在研究以下想法。希望你能帮忙 已更新 我增加了第三个问题,这将使问题更加复杂 数据 reprex <- structure(list(record_id = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3), day = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2,

我正在研究以下想法。希望你能帮忙

已更新

我增加了第三个问题,这将使问题更加复杂

数据

reprex <- structure(list(record_id = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 
3, 3, 3, 3), day = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 
10, 11, 12), rx_class = c(1, 0, 0, 0, 2, 2, 0, 0, 1, 0, 0, 0, 
1, 1, 0, 0, 2, 2, 3, 3, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 
0, 1, 0), streak = c(0, 1, 2, 3, 0, 0, 1, 2, 0, 1, 2, 3, 0, 0, 
1, 2, 0, 0, 0, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 0, 0, 0, 1, 2, 0, 
1), last_stop = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1
), reason = c(0, 1, 0, 0, 2, 0, 1, 0, 2, 4, 0, 0, 0, 0, 3, 0, 
2, 0, 0, 0, 1, 0, 0, 2, 1, 0, 0, 0, 0, 2, 0, 0, 1, 0, 2, 4), 
    reason_text = c(NA, "diarrhea", NA, NA, "recover", NA, "diarrhea", 
    NA, "recover", "vomiting", NA, NA, NA, NA, "sweating", NA, 
    "recover", NA, NA, NA, "diarrhea", NA, NA, "recover", "diarrhea", 
    NA, NA, NA, NA, "recover", NA, NA, "diarrhea", NA, "recover", 
    "vomiting")), row.names = c(NA, -36L), class = c("tbl_df", 
"tbl", "data.frame"))
当前问题 当我使用下面建议的代码时,它对前两个主题很有效。然而,受试者3以一个中断开始。如您所见,主题3的输出部分正确:
中断\u no
计数不正确,但跳过了第二次和第三次中断

# A tibble: 6 x 7
# Groups:   record_id [3]
  record_id interruption_no   day streak last_stop reason reason_text
      <dbl>           <int> <dbl>  <dbl>     <dbl>  <dbl> <chr>      
1         1               1     2      3         0      1 diarrhea   
2         1               2     7      2         0      1 diarrhea   
3         1               3    10      3         1      4 vomiting   
4         2               1     3      2         0      3 sweating   
5         2               2     9      3         0      1 diarrhea   
6         3              NA     1      5         0      1 diarrhea   
#一个tible:6 x 7
#组:记录编号[3]
记录\u id中断\u无日连续记录上次\u停止原因\u文本
1 1 2 3 0 1腹泻
2 1 2 7 2 0 1腹泻
311030314呕吐
4 2 1 3 2 0 3出汗
529301腹泻
6 3 NA 1 5 0 1腹泻

这不是最优雅的解决方案,但可能会有所帮助

您可以使用
cumsum
按中断分组,其中
rx_类
随时间从某个值更改为零。这将有助于将这些附生节点/条纹组合在一起

由于只对中断数据感兴趣,因此您可以使用
filter
删除
rx\u类

然后,您可以通过
record\u id
和我们新创建的组
summary
对您进行分组。
strike
将是给定中断的
max
值。它还将使用每个子组的第一行来确定其他列值

编辑:如果在停止治疗记录之前没有治疗,则在
lag
a
default
(可能有一些值表示“未知”治疗,但为了证明我将默认值设为1)

输出

  record_id interruption_no   day streak last_stop reason reason_text
      <dbl>           <int> <dbl>  <dbl>     <dbl>  <dbl> <chr>      
1         1               1     2      3         0      1 diarrhea   
2         1               2     7      2         0      1 diarrhea   
3         1               3    10      3         1      4 vomiting   
4         2               1     3      2         0      3 sweating   
5         2               2     9      3         0      1 diarrhea   
6         3               1     1      5         0      1 diarrhea   
7         3               2     9      2         0      1 diarrhea   
8         3               3    12      1         1      4 vomiting 
记录\u id中断\u无日连续上次\u停止原因\u文本
1 1 2 3 0 1腹泻
2 1 2 7 2 0 1腹泻
311030314呕吐
4 2 1 3 2 0 3出汗
529301腹泻
6311501腹泻
7 3 2 9 2 0 1腹泻
8312114呕吐

你好,本。这当然是正确的。仍在扫描这是否有效。我注意到,当第1天已经以0开始时(因此没有治疗),中断计数器不再工作。太好了-当你检查它时,请随意编辑你的示例,在其他可能存在问题的情况下,以及在这些情况下你的预期输出…我们可能需要
滞后
…Hi Ben,我想我现在已经总结了这个问题properly@GI-DEON6请参见编辑后的答案。尝试将
default=1
添加到
lag
中,以说明这不是可用于
rx_类
的“先前行”值的情况(停止前治疗未知的情况)…这是您所预测的。非常感谢:)
library(tidyverse)

reprex %>%
  group_by(record_id) %>%
  mutate(interruption_no = cumsum(lag(rx_class, default = 1) != 0 & rx_class == 0)) %>%
  filter(rx_class == 0) %>%
  group_by(record_id, interruption_no) %>%
  summarise(day = first(day),
            streak = max(streak),
            last_stop = first(last_stop),
            reason = first(reason),
            reason_text = first(reason_text))
  record_id interruption_no   day streak last_stop reason reason_text
      <dbl>           <int> <dbl>  <dbl>     <dbl>  <dbl> <chr>      
1         1               1     2      3         0      1 diarrhea   
2         1               2     7      2         0      1 diarrhea   
3         1               3    10      3         1      4 vomiting   
4         2               1     3      2         0      3 sweating   
5         2               2     9      3         0      1 diarrhea   
6         3               1     1      5         0      1 diarrhea   
7         3               2     9      2         0      1 diarrhea   
8         3               3    12      1         1      4 vomiting