我正在为生存分析准备一个数据集并使用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
我需要的是:
期望的结果是这样的:
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”循环,循环子集,甚至双循环。什么都行不通。我真的想学习更多关于循环的知识。
感谢所有提出任何想法的人。
答案 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