R中一个棘手的循环?

时间:2014-11-26 20:41:21

标签: r loops dplyr

我一直在努力解决R中的这项任务(我以前的SAS用户)。

设置/学习 - 观测数据。克罗恩病患者。数据是在2002 - 2013年期间每年收集的。 - 患者可以包括在任何一年,并且每年的访问可能是不规则的。 - 我知道每个病人的确切死亡日期。变量:DEATH_YEAR - 我知道复发的确切日期(感兴趣的终点)。 VARIABLE:RELAPSE_YEAR

我对复发的发生率感兴趣,我需要计算每年的复发次数除以当年活着的人数。现在的问题是,从包容性来看,个体是不规则的,但我确实知道他们当年是否真的活着,并且他们是否经历过复发。

如果我可以为每位患者创建12个新变量,我可以解决这个问题。每个新变量都应该是日历年,并且此变量应设置为' 1'如果患者在那一年还活着并且还没有经历过该事件。

因此问题是我需要创建一个年变量'被设置为' 1'因为这个人没有死亡,或者已经经历过这一事件,所以每年都会被列入其中。

一个例子: 患者X被列入2005年并于2009年去世。对他来说,我需要他遵循以下变量:' 2005' 2006',' 2007',' 2008& #39;和' 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数据集

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

对于这方面的任何建议,我将非常感激! 提前谢谢!

1 个答案:

答案 0 :(得分:2)

这有点hackish,但这会奏效。首先将数据转换为数字数据框,以便.变为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