R: Selecionando a primeira de n linhas consecutivas acima de um determinado valor limite

Eu tenho um quadro de dados com MRN, datas e um valor de teste.

Eu preciso selecionar todas asprimeiro linhas por MRN que possuemtrês valores consecutivos acima de 0,5.

Esta é uma versão de exemplo dos dados:

   MRN Collected_Date   ANC
1  001     2015-01-02 0.345
2  001     2015-01-03 0.532
3  001     2015-01-04 0.843
4  001     2015-01-05 0.932
5  002     2015-03-03 0.012
6  002     2015-03-05 0.022
7  002     2015-03-06 0.543
8  002     2015-03-07 0.563
9  003     2015-08-02 0.343
10 003     2015-08-03 0.500
11 003     2015-08-04 0.734
12 003     2015-08-05 0.455
13 004     2014-01-02 0.001
14 004     2014-01-03 0.500
15 004     2014-01-04 0.562
16 004     2014-01-05 0.503

Código de exemplo:

df <- data.frame(MRN = c('001','001','001','001',
                         '002','002','002','002',
                         '003','003','003','003',
                         '004','004','004','004'), 
                 Collected_Date = as.Date(c('01-02-2015','01-03-2015','01-04-2015','01-05-2015',
                                            '03-03-2015','03-05-2015','03-06-2015','03-07-2015',
                                            '08-02-2015','08-03-2015','08-04-2015','08-05-2015',
                                            '01-02-2014','01-03-2014','01-04-2014','01-05-2014'), 
                                            format = '%m-%d-%Y'), 
                 ANC = as.numeric(c('0.345','0.532','0.843','0.932',
                         '0.012','0.022','0.543','0.563',
                         '0.343','0.500','0.734','0.455',
                         '0.001','0.500','0.562','0.503')))

Atualmente, estou usando uma abordagem muito incômoda usando a função lag para calcular a diferença de data, depois filtrar todos os valores> = 0,5 e, em seguida, resumir os valores, o que ajuda a selecionar a data do TERCEIRO valor. Subtraio dois dias para obter a data do primeiro valor:

   df %>% group_by(MRN) %>% 
    mutate(., days_diff = abs(Collected_Date[1] - Collected_Date)) %>% 
        filter(ANC >= 0.5) %>%
            mutate(days = days_diff + lag((days_diff))) %>%
                filter(days == 5) %>%
                    mutate(Collected_Date = Collected_Date - 2) %>%
                        select(MRN, Collected_Date)

Resultado:

Fonte: quadro de dados local [2 x 2] Grupos: MRN

  MRN Collected_Date
1 001     2015-01-03
2 004     2014-01-03

Deve haver uma maneira mais simples / mais elegante. Além disso, ele não fornece resultados precisos se houver lacunas entre as datas dos testes.

Minha saída desejada para este exemplo é:

   MRN Collected_Date   ANC     
1  001     2015-01-03 0.532
2  004     2014-01-03 0.500

Portanto, se pelo menos três valores de teste consecutivos forem> = 0,5, a data do PRIMEIRO valor deve ser retornada.

Se não houver pelo menos três valores consecutivos> = 0,5, NA deve ser retornado.

Qualquer ajuda é muito apreciada!

Muito obrigado!

questionAnswers(4)

yourAnswerToTheQuestion