r - R 中的棘手循环?

标签 r loops dplyr

几天来我一直在努力解决 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/

相关文章:

r - 使用 ggplot 绘制带孔的多边形(在城市 map 中)

loops - 如何在 Kotlin 循环内更改 for 循环的计数器变量值?

c# - 是否可以在不设置 C# 中数组大小的情况下将输入循环输入到数组中?

r - 如何正确组合 mutate 和 str_match?

r - 使用 %in% 通过列表过滤多列并在 R 中过滤

r - 如何使用 ggplot 将图例放在多个分布的峰值中?

r - 更改 ggplot facet_wrap 的构面标题格式

php词过滤功能?

r - 使用条件变异分配多个值

r - R中的表情符号[UTF-8编码]