R 使用循环在唯一ID内移动条目

R 使用循环在唯一ID内移动条目,r,loops,for-loop,data-manipulation,survival-analysis,R,Loops,For Loop,Data Manipulation,Survival Analysis,我正在为生存分析准备一个数据集,遇到了这个问题,使用R。我想知道是否有“for loop”专家可以帮助我解决这个问题。如有任何建议,将不胜感激 数据集很长,只有三列:ID、date和一个数字变量。示例数据如下所示: 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

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

数据集很长,只有三列:ID、date和一个数字变量。示例数据如下所示:

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
这似乎是一个简单的转换,但请原谅我的拙劣技能,当我自己编写代码时,事情变得更加混乱。最初,我尝试了条件“for”循环、循环中的子集,甚至双循环。什么都不管用。我真的很想了解更多关于循环的知识


感谢所有有想法的人

这可以通过
dplyr
轻松完成

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

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

dat这可以通过
dplyr
轻松完成

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

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

dat您的
data.frame
没有很好的定义,应该是这样的(注意,不需要
cbind


您的
data.frame
没有很好的定义,应该是这样的(请注意,不需要
cbind


非常感谢安德鲁。我的思维在“for loop”上停留了很长时间,从未想过使用dplyr。这绝对是一个聪明和方便的方式来完成这项工作。非常感谢安德鲁。我的思维在“for loop”上停留了很长时间,从未想过使用dplyr。这绝对是一个出色而方便的完成工作的方式。嗨,芮,我真的很感谢你的投入。这种基于函数的方法效果很好。实际上,我正在努力学习更多关于函数和循环的知识。关于我在哪里可以找到更多相关阅读资料或在线课程,你有什么建议吗?@YayiZhao第一个参考是安装
R
后附带的
R-intro.pdf
。但它可能有点简练。你可以在网上找到很多网站。例如。还有很多其他的。嗨,芮,我真的很感谢你的意见。这种基于函数的方法效果很好。实际上,我正在努力学习更多关于函数和循环的知识。关于我在哪里可以找到更多相关阅读资料或在线课程,你有什么建议吗?@YayiZhao第一个参考是安装
R
后附带的
R-intro.pdf
。但它可能有点简练。你可以在网上找到很多网站。例如。还有很多其他的。
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
dat <- data.frame(ID, date, NV)
dat
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