变异与dplyr奇怪的错误

时间:2015-05-12 05:39:38

标签: r error-handling dplyr survival-analysis

我正在尝试使用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

我不知道为什么我会收到此错误,这意味着什么,以及为什么我的代码无效。

我非常感谢所有能得到的帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

这是因为您将变量引用为data1$year,这不适合分组数据(并且也适用于data1$end

答案 1 :(得分:1)

我挑逗了你的代码并发现了一些问题。一个是我在上面的评论中提到的事情。第二件事是end的班级。如果您提供的数据是一个,end是因素。如果在您自己的情况下是这种情况,则需要将end转换为日期对象。另一件事是year_aar > first_dayfirst_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