使用循环

时间:2017-08-24 16:54:53

标签: r loops for-loop data-manipulation survival-analysis

我正在为生存分析准备一个数据集并使用R来解决这个问题。我想知道是否有人“for loop”专家可以帮助我解决这个问题。任何建议将不胜感激。

数据集很长,只有三列:ID,日期和数字变量。示例数据如下所示:

ID<-c(1,1,1,1,2,2,3)
date<-c("05/11/2012","01/30/2013",
"06/14/2015","07/22/2016","01/07/2011","02/02/2012","02/03/2017")
NV<-c(12,22,14,5,17,6,25)
dat<-as.data.frame(cbind(x,y,z));dat

我需要的是:

  1. 创建附加列“event_date”
  2. 在每个唯一ID中,将第二行中的“date”移动到上一行中的“event_date”,将第三个“date”移动到第二个“event_date”......依此类推。如果它是此ID的最后一行,则打印“停止”。
  3. 如果某个ID只有一行,则还要打印“停止”。
  4. 期望的结果是这样的:

      ID       date NV event_date
    1  1 05/11/2012 12 01/30/2013
    2  1 01/30/2013 22 06/14/2015
    3  1 06/14/2015 14 07/22/2016
    4  1 07/22/2016  5       stop
    5  2 01/07/2011 17 02/02/2012
    6  2 02/02/2012  6       stop
    7  3 02/03/2017 25       stop
    

    这似乎是一个简单的转换,但原谅我的糟糕技能,因为我自己编码,事情变得更加混乱。最初,我尝试过条件“for”循环,循环子集,甚至双循环。什么都行不通。我真的想学习更多关于循环的知识。

    感谢所有提出任何想法的人。

2 个答案:

答案 0 :(得分:1)

使用dplyr即可轻松完成。

顺便说一下,你的data.frame行应该是......

dat <- data.frame(ID, date, NV, stringsAsFactors = FALSE)

由于x,y和z未定义,您可能不希望将日期字符串作为因素。

library(dplyr)
dat <- dat %>% group_by(ID) %>% mutate(event_date=lead(date, default = "stop"))

dat
# A tibble: 7 x 4
# Groups:   ID [3]
     ID       date    NV event_date
  <chr>      <chr> <chr>      <chr>
1     1 05/11/2012    12 01/30/2013
2     1 01/30/2013    22 06/14/2015
3     1 06/14/2015    14 07/22/2016
4     1 07/22/2016     5       stop
5     2 01/07/2011    17 02/02/2012
6     2 02/02/2012     6       stop
7     3 02/03/2017    25       stop

请注意,将单词&#34; stop&#34;在新列中将强制将其格式化为字符。如果您想将其格式化为日期,最好使用NA

答案 1 :(得分:1)

您的data.frame定义不明确,应该是(请注意,不需要cbind)。

dat <- data.frame(ID, date, NV)
dat

现在,仅限基数R

res <- lapply(split(dat, dat$ID), function(x){
        x$event_date <- c(as.character(x$date)[-1], "stop")
        x
    })
res <- do.call(rbind, res)
row.names(res) <- NULL
res
  ID       date NV event_date
1  1 05/11/2012 12 01/30/2013
2  1 01/30/2013 22 06/14/2015
3  1 06/14/2015 14 07/22/2016
4  1 07/22/2016  5       stop
5  2 01/07/2011 17 02/02/2012
6  2 02/02/2012  6       stop
7  3 02/03/2017 25       stop