在 R 中压缩数据框但保留最小/最大值

问题描述 投票:0回答:1

我正在为比例风险生存分析(基于野生动物遥测数据)格式化数据,并为数据设置间隔步骤。我希望结合这些时间步长,并且只在动物失踪超过 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

(从这个问题的答案之一复制

任何建议将不胜感激!

r tidyverse survival-analysis
1个回答
0
投票

我不太确定您想如何处理失败/原因,但是一种方法是

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 时该变量就会递增。

© www.soinside.com 2019 - 2024. All rights reserved.