我正在为比例风险生存分析(基于野生动物遥测数据)格式化数据,并为数据设置间隔步骤。我希望结合这些时间步长,并且只在动物失踪超过 1 个时间步长时才开始新的一行。
# Current data
id start end fail cause
1 1 2 3 0 NA
2 1 3 4 0 NA
3 1 4 5 0 NA
4 1 5 6 0 NA
5 1 6 7 0 NA
6 1 7 8 0 NA
7 1 8 9 0 NA
8 1 12 13 0 NA
9 1 13 14 0 NA
10 1 14 15 0 NA
11 1 15 16 0 NA
12 1 16 17 0 NA
13 1 17 18 0 NA
14 1 18 19 0 NA
15 1 19 20 0 NA
16 1 23 24 0 NA
17 1 24 25 0 Censored
18 2 2 3 0 NA
19 2 3 4 0 NA
20 2 4 5 0 NA
21 2 5 6 0 NA
22 2 6 7 0 Censored
23 3 2 3 0 NA
24 3 3 4 0 NA
25 3 8 9 1 Dead
我希望得到这样的东西:
# What I would like it to look like
id start end fail cause
1 1 2 9 0 Censored
2 1 12 20 0 Censored
3 1 23 25 0 Censored
4 2 2 7 0 Censored
5 3 2 4 0 Censored
6 3 8 9 1 Dead
我一直在做一些搜索,我想这样的事情可能会奏效,如果我能以某种方式为连续监测的每个时期创建一个唯一的标识(链接到动物 ID):
library(dplyr)
dat %>%
group_by(grp) %>%
mutate_at(vars(ends_with('high')), max) %>%
group_by_at(vars(ends_with('high')), .add = TRUE) %>%
summarise_at(vars(ends_with('low')), min)
# A tibble: 2 x 4
# Groups: grp, v1_high [2]
# grp v1_high v2_high v3_low
# <fct> <dbl> <dbl> <dbl>
#1 A 0.184 0.330 -0.305
#2 B 1.60 0.738 0.390
(从这个问题的答案之一复制)
任何建议将不胜感激!
我不太确定您想如何处理失败/原因,但是一种方法是
dat %>%
group_by(id, gap=cumsum(start - lag(end, default = first(start))>1)) %>%
summarize(start=first(start), end=last(end),
fail=last(fail), cause=coalesce(last(cause),"Censored")) %>%
select(-gap)
# id start end fail cause
# <int> <int> <int> <int> <chr>
# 1 1 2 9 0 Censored
# 2 1 12 20 0 Censored
# 3 1 23 25 0 Censored
# 4 2 2 7 0 Censored
# 5 3 2 4 0 Censored
# 6 3 8 9 1 Dead
这是通过创建一个“差距”变量来实现的,每次开始和上一个最后之间的差异大于 1 时该变量就会递增。