Усечение набора данных после максимального значения

У меня есть набор данных с повторяющимися измерениями во времени, в котором я ищу предикторы максимального значения tn. Меня не интересуют меры, которые происходят после этого. Максимальные значения наблюдаются в разные дни у разных пациентов.

ID  day  tn  hb  sofa  
1    1   7   85   NA  
1    2   NA  NA   NA  
1    3   35  80   13  
1    4   28  79   12  
2    1   500 NA   12  
2    2   280 80   9  
2    3   140 90   8  
2    4   20  90   7  
3    1   60  80   12  
3    2   75  75   10  
3    3   NA  75   NA  
3    4   55  84   7  

I can find tn_ max:

    tn_max <- df %>% group_by(record) %>% summarise(tn_max = max(tn,na.rm=TRUE))

Как усечь набор данных после максимального tn для каждого пациента?
Я нашел этот код из предыдущего похожего вопроса, но я не могу заставить его работать ошибка: непредвиденный ‘:’ в «N_max = find(df(:»

    mod_df = df; 
    N_max = find(df(:,3) == max(df(:,3)));
    N_max(1);

    for N=1:size(df,3)
    if df(N,1) < N_max
    mod_df (N,:)=0;
    end
    end
    mod_data_1(all(mod_data_1==0,1),:) = []

Большое спасибо,
Annemarie

2 ответа

  1. Сначала я бы создал функцию, способную возвращать для любого вектора Булев вектор той же длины и коэффициенты которогоTRUE, если значение происходит до максимума, и FALSEв противном случае:

    f <- function(x) 1:length(x) <= which.max(x)
    

    Тогда я бы применил эту функцию к каждому под-векторуtn, определяемому ID :

    ind <- as.logical(ave(df$tn, df$ID, FUN=f))
    

    Наконец, все, что мне нужно сделать, это взять соответствующее подмножество исходного фрейма данных:

    df[ind, ]
    
  2. Вы могли бы попробовать:

    df %>% group_by(ID) %>% slice(seq_len(which(tn == max(tn,na.rm=TRUE))))
    Source: local data frame [6 x 5]
    Groups: ID [3]
    
         ID   day    tn    hb  sofa
      (int) (int) (int) (int) (int)
    1     1     1     7    85    10
    2     1     2    15    84    12
    3     1     3    35    80    13
    4     2     1   500    76    12
    5     3     1    60    80    12
    6     3     2    75    75    10