Group by ID e il Risultato e prendere le prime prime Date di risultati specifici e assegnare numeri.e outcome1, outcome2)

0

Domanda

Mi scuso se non sto a spiegare chiaramente. Ma ho il seguente insieme di dati:

mydata = data.frame (Id =c (1,1,1,1,1,1,1,1,2,2,2,2),
Date = c("2001-01-31", "2001-02-13","2001-05-31",
"2001-06-02","2018-01-31","2018-03-31","2018-07-31",
"2019-04-04","2014-01-31","2014-02-02","2014-04-31",
"2014-05-18"),Outcome = c("CR","CR","Relapse","Relapse",
"CR","CR","CR","Relapse","CR", "CR","Relapse","CR"))

Che uscite sotto. Come si può vedere ogni paziente è in alcune fasi, in tempi diversi e vorrei catturare le prime date di quando ogni nuova fase inizia per paziente. Vorrei rinominare queste fasi di CR1, Relapse1, CR2, Relapse2 e così via.

Id     Date        Outcome
1   2001-01-31  CR      
1   2001-02-13  CR      
1   2001-05-31  Relapse     
1   2001-06-02  Relapse     
1   2018-01-31  CR      
1   2018-03-31  CR      
1   2018-07-31  CR      
1   2019-04-04  Relapse     
2   2014-01-31  CR      
2   2014-02-02  CR
2   2014-04-31  Relapse     
2   2014-05-18  CR      
 

Questo è il risultato che sto cercando di realizzare:

Id     CR1       Relapse1      CR2       Relapse2
1   2001-01-31  2001-05-31  2018-01-31  2019-04-04
2   2014-01-31  2014-04-31  2014-05-18  NA

Io non sono abbastanza sicuri da dove cominciare con questa domanda e gradirei qualsiasi aiuto! Grazie ragazzi!

data-manipulation group-by r
2021-11-23 19:44:31
1

Migliore risposta

3

Con tidyverse si può provare il seguente.

(Se necessario, in primo arrange da Date così è in ordine cronologico.)

Creare un raggruppamento di valore a seconda dei cambiamenti dell' Outcome colonna (da remissione delle ricadute e viceversa). Ho usato rleid da data.table per comodità e creato una colonna temporanea, Grp. Per esempio:

      Id Date       Outcome   Grp
   <dbl> <chr>      <chr>   <int>
 1     1 2001-01-31 CR          1
 2     1 2001-02-13 CR          1
 3     1 2001-05-31 Relapse     2
 4     1 2001-06-02 Relapse     2
 5     1 2018-01-31 CR          3
 6     1 2018-03-31 CR          3
 7     1 2018-07-31 CR          3
 8     1 2019-04-04 Relapse     4
 9     2 2014-01-31 CR          1
10     2 2014-02-02 CR          1
11     2 2014-04-31 Relapse     2
12     2 2014-05-18 CR          3

Si può vedere, all'interno di ogni Idche , quando l' Outcome modifiche, il Grp aumenta. In quel modo, le successive date con lo stesso Outcome saranno incluse nella stessa Grp.

Il .add argomento ci permette di aggiungere Grp per la prima del raggruppamento, che è stato appena Id. Così, il raggruppamento ora sia Grp e Idsi può quindi slice la prima riga. slice(1) o slice(n = 1) manterrà 1 riga all'interno del gruppo. In questo caso, abbiamo raggruppati per Id e Grp, in modo che solo 1 riga saranno conservati per un determinato Grp e Id la combinazione.

Infine, è possibile aggiungere un numero di riga che permetterà, per la grande uscita descritto (una sequenza consecutiva di numeri per il CR e la Ricaduta: 1, 2, 3, 4...). In questo caso, abbiamo group_by entrambi Id e Outcomee consecutivamente numero di date per questa combinazione. pivot_wider messo i dati in formato wide, se desiderato.

library(data.table)
library(tidyverse)

mydata %>%
  group_by(Id) %>%
  mutate(Grp = rleid(Outcome)) %>%
  group_by(Grp, .add = T) %>%
  slice(1) %>%
  group_by(Id, Outcome) %>%
  mutate(n = row_number()) %>%
  pivot_wider(id_cols = Id, names_from = c(Outcome, n), values_from = Date)

Uscita

     Id CR_1       Relapse_1  CR_2       Relapse_2 
  <dbl> <chr>      <chr>      <chr>      <chr>     
1     1 2001-01-31 2001-05-31 2018-01-31 2019-04-04
2     2 2014-01-31 2014-04-31 2014-05-18 NA  
2021-11-23 21:26:09

Grazie! Ho provato ma continuo a ricevere il seguente errore: ` Errore: il Problema è l'aggiunta di colonne calcolate in group_by(). x Problema con mutate() ingresso Grp. x non riusciva a trovare la funzione "rleid" ℹ Ingresso Grp è rleid(Outcome) ``
T K

@Ben, ahh si erano più veloci di me da 3 minuti :( Comunque ho potuto solo riesce a risolvere utilizzando i sottoinsiemi ed i shitf() funzione. Può spiegare che cosa significa questa riga: group_by(Grp = rleid(Outcome), .add = T) %>% fare? Così come slice(1) .
RobertoT

@Ben, Che ha funzionato perfettamente, grazie mille!
T K

@Ben Totalmente utile!
RobertoT

Modificato in modo che con rleid la numerazione riparte con variazione Id.
Ben

@Ben Follow-up domanda su questo se non vi dispiace. È possibile avviare il conteggio dopo il primo CR è stato visto? Quindi, se un id è Ricaduta prima di CR che dovrebbe essere ignorato e quindi prima recidiva dopo il primo CR sarebbe considerata come una Ricaduta 1? Grazie!!
T K

@TK ho risposto all'altra tua domanda - spero che questo aiuta!
Ben

In altre lingue

Questa pagina è in altre lingue

Русский
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................