几天来我一直在努力解决 R 中的这个任务(我以前是 SAS 用户)。
设置/研究 - 观测数据。克罗恩病患者。 2002-2013 年期间每年收集数据。 - 任何一年都可以纳入患者,并且每年的访问可能不定期。 - 我知道每位患者的确切死亡日期。变量:DEATH_YEAR - 我知道复发的确切日期(感兴趣的终点)。变量:RELAPSE_YEAR
我对复发的发生率很感兴趣,我需要计算每年的复发次数除以当年存活的人数。现在的问题是,由于包容,个人来得不规律,但我确实知道他们当年是否真的还活着,以及他们是否经历过旧病复发。
如果我能为每位患者创建 12 个新变量,我就能解决这个问题。每个新变量都应该是日历年,如果患者在那一年还活着并且尚未经历该事件,则该变量应设置为“1”。
因此,问题是我需要创建一个“年份变量”,假设该人没有死,或者没有经历过该事件,则在包含时和之后的每一年都将其设置为“1”。
一个例子: 患者 X 于 2005 年入组并于 2009 年去世。对于他,我需要将以下变量设置为:“2005”、“2006”、“2007”、“2008”和“2009”设置为“1”。 患者 Y 在 2005 年被纳入并经历了 2007 年的事件。对于他,我需要以下变量:'2005'、'2006'、2007' 设置为 '1'。 (是的,事件/死亡年份仍需要设置为“1”)。
这是我的数据集的样子:
data <- read.table(header = TRUE, text = "
patient visit first_visit relapse_year death_year
1 2003 2003 . 2010
1 2004 2003 . 2010
1 2009 2003 . 2010
2 2002 2002 2006 .
2 2006 2002 2006 .
2 2006 2002 2006 .
2 2008 2002 2006 .
2 2012 2002 2006 .
3 2004 2004 . .
3 2008 2004 . .
3 2008 2004 . .
")
这是期望的数据集
desired_data <- read.table(header = TRUE, text = "
patient visit first_visit relapse_year death_year YEAR2002 YEAR2003 YEAR2004 YEAR2005 YEAR2006 YEAR2007 YEAR2008 YEAR2009 YEAR2010 YEAR2011 YEAR2012
1 2003 2003 . 2010 . 1 1 1 1 1 1 1 1 . .
1 2004 2003 . 2010 . 1 1 1 1 1 1 1 1 . .
1 2009 2003 . 2010 . 1 1 1 1 1 1 1 1 . .
2 2002 2002 2006 . 1 1 1 1 1 . . . . . .
2 2006 2002 2006 . 1 1 1 1 1 . . . . . .
2 2006 2002 2006 . 1 1 1 1 1 . . . . . .
2 2008 2002 2006 . 1 1 1 1 1 . . . . . .
2 2012 2002 2006 . 1 1 1 1 1 . . . . . .
3 2004 2004 . . . . 1 1 1 1 1 1 1 1 1
3 2008 2004 . . . . 1 1 1 1 1 1 1 1 1
3 2008 2004 . . . . 1 1 1 1 1 1 1 1 1
")
如果有任何建议,我将不胜感激! 提前致谢!
最佳答案
这有点骇人听闻,但这会奏效。首先将您的数据转换为数字数据框,以便 .
转换为 NA
:
data0<-data.frame(lapply(data,function(x) as.numeric(as.character(x))))
head(data0)
# patient visit first_visit relapse_year death_year
# 1 1 2003 2003 NA 2010
# 2 1 2004 2003 NA 2010
# 3 1 2009 2003 NA 2010
# 4 2 2002 2002 2006 NA
# 5 2 2006 2002 2006 NA
# 6 2 2006 2002 2006 NA
然后用 2012 年(或任何最后一年)代替 NA 值。
data0[is.na(data0)]<-2012
现在您可以使用 pmin
来确定距离患者死亡/复发/实验结束还有多长时间。最后要做的是对列号使用算术来创建新数据集:
activeYears<-matrix(0,nrow(data0),11)
colnames(activeYears)<-2002:2012
startYear<-data0$first_visit[row(activeYears)]
endYear<-pmin(data0$relapse_year[row(activeYears)],data0$death_year[row(activeYears)])
colYear<-col(activeYears)+2001
activeYears[]<-startYear<=colYear & endYear>=colYear
activeYears
# 2002 2003 2004 2005 2006 2007 2008 2009 2010 2011 2012
# [1,] 0 1 1 1 1 1 1 1 1 0 0
# [2,] 0 1 1 1 1 1 1 1 1 0 0
# [3,] 0 1 1 1 1 1 1 1 1 0 0
# [4,] 1 1 1 1 1 0 0 0 0 0 0
# [5,] 1 1 1 1 1 0 0 0 0 0 0
# [6,] 1 1 1 1 1 0 0 0 0 0 0
# [7,] 1 1 1 1 1 0 0 0 0 0 0
# [8,] 1 1 1 1 1 0 0 0 0 0 0
# [9,] 0 0 1 1 1 1 1 1 1 1 1
#[10,] 0 0 1 1 1 1 1 1 1 1 1
#[11,] 0 0 1 1 1 1 1 1 1 1 1
关于r - R 中的棘手循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27158499/