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
adefault
(可能有一些值表示“未知”治疗,但为了证明我将默认值设为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