【问题标题】:A tricky loop in R?R中的一个棘手的循环?
【发布时间】:2015-01-25 07:59:13
【问题描述】:

几天来我一直在努力解决 R 中的这个任务(我是前 SAS 用户)。

设置/研究 - 观察数据。克罗恩病患者。数据在 2002-2013 年间每年收集一次。 - 患者可以在任何一年被包括在内,并且每年的访问可能不定期。 - 我知道每个病人的确切死亡日期。变量:死亡_年 - 我知道复发的确切日期(感兴趣的终点)。变量: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 数据集

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

如果您对此提出任何建议,我将不胜感激! 提前致谢!

【问题讨论】:

  • 在得到你想要的数据集后,你会做生存分析吗?因为,如果你这样做了,你就不需要那样重组你的数据了。
  • 您希望创建这样一个表的原因是什么?也许更简洁的东西可以完成同样的事情?
  • 您好,感谢您的回复。我正在做生存分析,但我(认为)需要这种设置,因为我正在计算绝对估计(每 1000 人年的发病率)和相对风险估计(通过 Cox 回归的风险比)。现在,如果我想计算每年的发病率(我正在检查时间趋势),那么我相信我需要那个设置。干杯
  • 即,我需要每年有风险的人数和当年的事件数来计算发病率。很抱歉有任何混淆..
  • 如果你只需要这些,你就不需要这个数据结构了。

标签: r loops dplyr


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多