Group by ID et les Résultats et de prendre les premières Dates de résultats et l'attribution de numéros (j'.e conséquence1, outcome2)

0

La question

Toutes mes excuses si je ne suis pas d'expliquer cela clairement. Mais j'ai le dataset suivant:

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"))

Les résultats ci-dessous. Comme vous pouvez le voir chaque patient est dans certaines phases, à différents moments, et je voudrais saisir les dates les plus à chaque nouvelle phase commence par patient. Je voudrais renommer ces phases de CR1, Relapse1, CR2, Relapse2 et ainsi de suite.

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      
 

C'est la sortie, je suis en train de réaliser:

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

Je ne suis pas tout à fait sûr où commencer avec cette question et serait reconnaissant de toute aide! Merci les gars!

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

La meilleure réponse

3

Avec tidyverse vous pouvez essayer ce qui suit.

(Si nécessaire, d'abord arrange par Date il est donc dans l'ordre chronologique.)

Créer une valeur de regroupement en fonction du changement de l' Outcome colonne (de remise de rechute et vice versa). J'ai utilisé rleid à partir de data.table pour des raisons de commodité et créé un temporaire de la colonne, Grp. Par exemple:

      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

Vous pouvez le voir, à l'intérieur de chaque Idque , lorsque le Outcome les changements, les Grp les augmentations. De cette façon, des dates ultérieures avec le même Outcome sera inclus dans le même Grp.

L' .add l'argument nous permet d'ajouter Grp à l'avant de regroupement, qui était juste Id. Donc, groupement aujourd'hui par les deux Grp et Idensuite , vous pouvez slice la première ligne. slice(1) ou slice(n = 1) gardera 1 rangée à l'intérieur du groupe. Dans ce cas, nous les avons regroupés par deux Id et Grp, de sorte que seulement 1 ligne seront conservées pour une Grp et Id la combinaison.

Enfin, vous pouvez ajouter un numéro de ligne, ce qui permettra de l'échelle de sortie décrit (consécutifs de la séquence de nombres pour le CR et les Rechutes: 1, 2, 3, 4...). Dans ce cas, nous group_by les deux Id et Outcomeet numéroter consécutivement les dates pour cette combinaison. pivot_wider insérer les données en grand format si vous le souhaitez.

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)

Sortie

     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

Merci!!!! J'ai essayé, mais reçois le message d'erreur suivant: ` Erreur: Problème d'ajout de colonnes calculées dans group_by(). x Problème avec mutate() entrée Grp. x ne pouvait pas trouver la fonction "rleid" ℹ d'Entrée Grp est rleid(Outcome) ``
T K

@Ben, ahh vous avez été plus rapide que moi en 3 minutes :( de toute façon je ne pourrait réussir à le résoudre à l'aide des sous-ensembles et shitf() fonction. Pouvez-vous expliquer ce que fait cette ligne: group_by(Grp = rleid(Outcome), .add = T) %>% faire? Ainsi que slice(1) .
RobertoT

@Ben Qui a fonctionné parfaitement, merci beaucoup!
T K

@Ben Totalement utile!
RobertoT

Édité de façon à ce que, avec rleid numérotation redémarre avec changement de Id.
Ben

@Ben question de Suivi sur ce si vous n'avez pas l'esprit. Est-il possible de ne commencer le comptage après le premier CR a été vu? Donc, si un id a Rechute avant de CR qui sera ignoré et puis la première rechute après le premier CR serait considéré comme une Rechute 1? Merci!!!!!
T K

@TK j'ai répondu à votre question - espérons que cette aide!
Ben

Dans d'autres langues

Cette page est dans d'autres langues

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