我正在尝试使用dplyr中的mutate创建新变量,我无法理解我的错误,我已经尝试了所有内容并且在过去没有偶然发现这个问题。
我有一个大型数据集,超过一百万次观察。我只向你提供了20个第一次观察。
这就是我的数据:
data1 <- read.table(header=TRUE, text="IDnr visit time year end event survival
7 1 04/09/06 2006 31/12/06 0 118
7 2 04/09/06 2007 31/12/07 0 483
7 3 04/09/06 2008 31/12/08 0 849
7 4 04/09/06 2009 31/12/09 0 1214
7 5 04/09/06 2010 31/12/10 0 1579
7 6 04/09/06 2011 31/12/11 0 1944
20 1 24/10/03 2003 31/12/03 0 68
20 2 24/10/03 2004 31/12/04 0 434
20 3 24/10/03 2005 31/12/05 0 799
20 4 24/10/03 2006 31/12/06 0 1164
20 5 24/10/03 2007 31/12/07 0 1529
20 6 24/10/03 2008 31/12/08 0 1895
20 7 24/10/03 2009 31/12/09 0 2260
20 8 24/10/03 2010 31/12/10 0 2625
20 9 24/10/03 2011 31/12/11 0 2990
87 1 17/01/06 2006 31/12/06 0 348
87 2 17/01/06 2007 31/12/07 0 713
87 3 17/01/06 2008 31/12/08 0 1079
87 4 17/01/06 2009 31/12/09 0 1444
87 5 17/01/06 2010 31/12/10 0 1809")
我必须说日期和时间变量在我的数据集中没有这种格式,我没有用POSIXct编码格式(“%Y-%m-%d”)。当我附加到stackoverflow并应用“代码”引用时,我不知何故重新格式化。
Okey,问题在于我正在尝试在同一个数据集中创建新的生存时间变量,一个用于具有停止和开始时间的cox回归模型(生存是停止时间,新的启动变量应该被称为survcox )。我也试图进行泊松回归,其中偏移量变量(即生存时间变量)应称为幸存者。这是我正在尝试使用的代码;
data2 <- data1 %>%
group_by(IDnr) %>%
mutate(survcox = ifelse(visit==1, 0, lag(survival)),
year_aar = substr(data1$year, 1,4), first_day = as.POSIXct(paste0(year_aar, "-01-01-")),
survpois = as.numeric(data1$end - first_day)+1) %>%
mutate(survpois = ifelse(year_aar > first_day, as.numeric(end - year_aar),
survpois)) %>%
ungroup()
我在这一步中收到错误!
错误:大小不兼容(1345000),期望6(组大小)或1
我不知道为什么我会收到此错误,这意味着什么,以及为什么我的代码无效。
我非常感谢所有能得到的帮助,谢谢!
答案 0 :(得分:1)
这是因为您将变量引用为data1$year
,这不适合分组数据(并且也适用于data1$end
)
答案 1 :(得分:1)
我挑逗了你的代码并发现了一些问题。一个是我在上面的评论中提到的事情。第二件事是end
的班级。如果您提供的数据是一个,end
是因素。如果在您自己的情况下是这种情况,则需要将end
转换为日期对象。另一件事是year_aar > first_day
。 first_day
是日期对象,而year_arr
是字符。鉴于这些,我修改了你的代码。
data1 %>%
group_by(IDnr) %>%
mutate(survcox = ifelse(visit == 1, 0, lag(survival)),
year_aar = substr(year, 1,4),
first_day = as.POSIXct(paste0(year_aar, "-01-01-")),
survpois = as.numeric(as.POSIXct(end, format = "%d/%m/%y") - first_day) + 1) %>%
mutate(survpois = ifelse(as.numeric(year_aar) > as.numeric(format(first_day, "%Y")),
as.numeric(as.POSIXct(end, format = "%d/%m/%y") - year_aar), survpois)) %>%
ungroup()
这是一个结果。
# IDnr visit time year end event survival survcox year_aar first_day survpois
#1 7 1 04/09/06 2006 31/12/06 0 118 0 2006 2006-01-01 365
#2 7 2 04/09/06 2007 31/12/07 0 483 118 2007 2007-01-01 365
#3 7 3 04/09/06 2008 31/12/08 0 849 483 2008 2008-01-01 366
#4 7 4 04/09/06 2009 31/12/09 0 1214 849 2009 2009-01-01 365
#5 7 5 04/09/06 2010 31/12/10 0 1579 1214 2010 2010-01-01 365