在 r 中生成用于生存分析的数据
Generating Data for Survival Analysis in r
我有一个数据框,记录一个人是否每年服用某种药物:
df_og <- data.frame(
id=c(1,1,1,2,2,2,3,3,3,3),
year=c(2001,2002,2003,2001,2002,2003,2000,2001,2002,2003),
med1=c(1,1,1,1,1,0,0,0,0,1),
med2=c(0,0,0,0,0,1,0,0,1,0),
med3=c(0,0,0,0,0,0,1,1,0,0)
)
看起来像这样:
id year med1 med2 med3
1 2001 1 0 0
1 2002 1 0 0
1 2003 1 0 0
2 2001 1 0 0
2 2002 1 0 0
2 2003 0 1 0
3 2000 0 0 1
3 2001 0 0 1
3 2002 0 1 0
3 2003 1 0 0
所以 id
列显示受试者的 ID,year
观察年份,并且 med1-2-3
变量是虚拟的,如果药物已经服用并且 = 0 如果不是。
我正在尝试创建一个新的数据框:
id = c(1,2,2,3,3,3),
time = c(3,2,1,2,1,1),
failure = c(0,1,0,1,1,0),
group = c(1,1,2,3,2,1))
看起来像:
id time failure med_group
1 3 0 1
2 2 1 1
2 1 0 2
3 2 1 3
3 1 1 2
3 1 0 1
其中:id
显示受试者 ID,time
计算受试者服用某种药物的连续年数,failure
如果在给定年份内受试者更换药物, med_group
受试者一直服用的药物。
示例:
- 第一行
df
,受试者id=1
连续3年服用med1
,所以time=3
并且没有转其他,所以failure=0
.
- 第二排
df
,id=2
连续2年拿med1
,所以time=2
,failure=0
,med_group=1
.但后来切换到med2
,所以time=1
、failure=1
和med_group=2
。
其他的依此类推。这是一个棘手的操作,所以我希望问题足够清楚。
欢迎任何建议!干杯
我们可以得到长格式的数据,删除行value = 0
,replace
每个id
中的最后一个值到0表示没有失败。然后我们 group_by
name
来计算每组中的行数,以及 failure
是否发生。
library(dplyr)
df_og %>%
tidyr::pivot_longer(cols = starts_with('med')) %>%
filter(value != 0) %>%
group_by(id) %>%
mutate(value = replace(value, n(), 0)) %>%
group_by(name, add = TRUE) %>%
summarise(time = n(),
failure = +all(value == 1))
# id name time failure
# <dbl> <chr> <int> <int>
#1 1 med1 3 0
#2 2 med1 2 1
#3 2 med2 1 0
#4 3 med1 1 0
#5 3 med2 1 1
#6 3 med3 2 1
我有一个数据框,记录一个人是否每年服用某种药物:
df_og <- data.frame(
id=c(1,1,1,2,2,2,3,3,3,3),
year=c(2001,2002,2003,2001,2002,2003,2000,2001,2002,2003),
med1=c(1,1,1,1,1,0,0,0,0,1),
med2=c(0,0,0,0,0,1,0,0,1,0),
med3=c(0,0,0,0,0,0,1,1,0,0)
)
看起来像这样:
id year med1 med2 med3
1 2001 1 0 0
1 2002 1 0 0
1 2003 1 0 0
2 2001 1 0 0
2 2002 1 0 0
2 2003 0 1 0
3 2000 0 0 1
3 2001 0 0 1
3 2002 0 1 0
3 2003 1 0 0
所以 id
列显示受试者的 ID,year
观察年份,并且 med1-2-3
变量是虚拟的,如果药物已经服用并且 = 0 如果不是。
我正在尝试创建一个新的数据框:
id = c(1,2,2,3,3,3),
time = c(3,2,1,2,1,1),
failure = c(0,1,0,1,1,0),
group = c(1,1,2,3,2,1))
看起来像:
id time failure med_group
1 3 0 1
2 2 1 1
2 1 0 2
3 2 1 3
3 1 1 2
3 1 0 1
其中:id
显示受试者 ID,time
计算受试者服用某种药物的连续年数,failure
如果在给定年份内受试者更换药物, med_group
受试者一直服用的药物。
示例:
- 第一行
df
,受试者id=1
连续3年服用med1
,所以time=3
并且没有转其他,所以failure=0
. - 第二排
df
,id=2
连续2年拿med1
,所以time=2
,failure=0
,med_group=1
.但后来切换到med2
,所以time=1
、failure=1
和med_group=2
。
其他的依此类推。这是一个棘手的操作,所以我希望问题足够清楚。
欢迎任何建议!干杯
我们可以得到长格式的数据,删除行value = 0
,replace
每个id
中的最后一个值到0表示没有失败。然后我们 group_by
name
来计算每组中的行数,以及 failure
是否发生。
library(dplyr)
df_og %>%
tidyr::pivot_longer(cols = starts_with('med')) %>%
filter(value != 0) %>%
group_by(id) %>%
mutate(value = replace(value, n(), 0)) %>%
group_by(name, add = TRUE) %>%
summarise(time = n(),
failure = +all(value == 1))
# id name time failure
# <dbl> <chr> <int> <int>
#1 1 med1 3 0
#2 2 med1 2 1
#3 2 med2 1 0
#4 3 med1 1 0
#5 3 med2 1 1
#6 3 med3 2 1