Group by ID a Výsledek a vzít nejbližší nejbližší Termíny konkrétních výsledků a přiřazení čísel (.e outcome1, outcome2)

0

Otázka

Omlouvám se, pokud nejsem, to vysvětluje jasně. Ale mám následující datové sady:

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

Které výstupy níže. Jak můžete vidět, každý pacient je v určitých fázích v různých časech a rád bych, aby se zachytit nejčasnější datum, kdy každá nová fáze začíná na pacienta. Rád bych pak, abyste přejmenovat tyto fáze CR1, Relapse1, CR2, Relapse2 a tak dále.

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      
 

To je výkon, já jsem se snaží dosáhnout:

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

Nejsem si zcela jistý, kde začít s touto otázkou a chtěl bych ocenit pomoc! Děkuji vám kluci!

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

Nejlepší odpověď

3

S tidyverse můžete zkusit následující.

(Pokud je to nutné, v první arrange o Date tak to je v chronologickém pořadí.)

Vytvořit seskupení hodnotu v závislosti na změně Outcome sloupec (od remise k relapsu a naopak). Použil jsem rleid z data.table pro větší pohodlí a vytvořili dočasný sloupec, Grp. Například:

      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

Můžete vidět, v každém Id,, že když Outcome změny, Grp zvyšuje. Že způsob, následné termíny se stejným Outcome bude zahrnuta ve stejné Grp.

Na .add argument, nám umožňuje přidat Grp na předchozím seskupení, který byl jen Id. Takže, seskupení teď oba Grp a Idmůžete pak slice první řadě. slice(1) nebo slice(n = 1) bude mít 1 řádek uvnitř skupiny. V tomto případě, máme seskupeny podle obou Id a Grp,, takže jen 1 řádek budou zachovány pro dané Grp a Id kombinace.

A konečně, můžete přidat číslo řádku, které vám umožňují širokou výstup popsáno (sekvence po sobě jdoucích čísel pro ČR a Relapsu: 1, 2, 3, 4...). V tomto případě, jsme group_by oba Id a Outcomea postupně počet dat pro tuto kombinaci. pivot_wider bude dát data do širokého formátu, pokud je to žádoucí.

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)

Výstup

     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

Děkuji!!! Zkoušel jsem to, ale stále následující chyba: `` Chyba: Problém přidání vypočítaného sloupce v group_by(). x Problém s mutate() vstup Grp. x nemohl najít funkci "rleid" ℹ Vstup Grp je rleid(Outcome) ``
T K

@Bene, ach byli jste rychlejší než já, do 3 minut :( Každopádně jsem jen dokázala řešit pomocí podmnožiny a shitf() funkce. Můžete mi vysvětlit, co dělá tento řádek: group_by(Grp = rleid(Outcome), .add = T) %>% dělat? Stejně jako slice(1) .
RobertoT

@Ben, Který pracoval perfektně, děkuji moc!
T K

@Ben Zcela užitečné!
RobertoT

Upravit tak, aby s rleid číslování restartuje se změnit v Id.
Ben

@Ben navazující otázka na to, jestli vám to nevadí. Je to vůbec možné, aby jen začít počítat po prvních CR byl viděn? Takže pokud id má Relapsu než ČR, že by mělo být ignorováno a pak první relaps po prvním ČR by být považovány za Relaps 1? Děkuji!!!!
T K

@TK jsem odpověděl na vaši další otázku - doufám, že to pomůže!
Ben

V jiných jazycích

Tato stránka je v jiných jazycích

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