如果我沒有清楚地解釋這一點,請道歉。但我有以下資料集:
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"))
輸出以下內容。正如您所看到的,每個患者在不同時間處于特定階段,我想記錄每個患者每個新階段開始的最早日期。然后我想將這些階段重命名為 CR1、Relapse1、CR2、Relapse2 等等。
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
這是我試圖實作的輸出:
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
我不太確定從哪里開始這個問題,希望得到任何幫助!謝謝你們!
uj5u.com熱心網友回復:
有了tidyverse你可以嘗試以下。
(如果需要,首先arrange按Date時間順序排列。)
根據Outcome列中的變化(從緩解到復發,反之亦然)創建一個分組值。為方便起見,我使用了rleidfromdata.table并創建了一個臨時列Grp. 例如:
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 5
10 2 2014-02-02 CR 5
11 2 2014-04-31 Relapse 6
12 2 2014-05-18 CR 7
你可以看到,在每個 中Id,當Outcome變化時,Grp增加。這樣,具有相同的后續日期Outcome將包含在相同的Grp.
該.add引數允許我們添加Grp到先前的分組,即Id. 因此,現在按Grp和分組Id,您可以slice在第一行。slice(1)或slice(n = 1)將在組內保留 1 行。在這種情況下,我們同時按Idand分組Grp,因此對于給定的GrpandId組合,只會保留 1 行。
最后,您可以添加一個行號,以允許所描述的寬輸出(CR 和復發的連續數字序列:1、2、3、4...)。在這種情況下,我們group_by同時使用Id和Outcome,并連續編號此組合的日期。pivot_wider如果需要,會將資料轉換為寬格式。
library(data.table)
library(tidyverse)
mydata %>%
group_by(Id) %>%
group_by(Grp = rleid(Outcome), .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)
輸出
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
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/364179.html
上一篇:洗掉串列串列中的常見字符
下一篇:使用Names()函式洗掉CSV
