2016-07-12 120 views
0

我是R新手,发现很难生成一系列行,其中每个生成的行都有一个计算日期。根据r中的一个日期生成日期列表

例如,从这样的数据集去:

Name date_birth 
Greg 01/02/2015 
Fred 02/02/2015 

...生成以下:

Name date_birth age date_atage<br/> 
Greg 01/02/2015 0  01/02/2015 
Greg 01/02/2015 1  02/02/2015 
Greg 01/02/2015 2  03/02/2015 
Fred 02/02/2015 0  02/02/2015 
Fred 02/02/2015 1  03/02/2015 
Fred 02/02/2015 2  04/02/2015 

我一直在研究网站,如R-博客,一般教学博客,本网站和我一直试图找出涉及Seq声明的循环声明,以便每个人(例如Greg,Fred等)都可以在计算日期并将其放置在自己的行中时重复该过程。你的第一个想法可能是在Excel中这样做更简单,但这不是,因为我需要为800多个人(即不只是格雷格和弗雷德)以及300天以上的人重复这一点。

+0

你从哪里得到的年龄,还是只是一个递增? – MikeRSpencer

+0

是的,它只增加1天。但我希望生成的列表从1日龄到300日龄。所以基本上为每个人生成300个新行。 – ElTenero

回答

3

我们可以使用data.table

library(data.table) 
setDT(df1)[, .(date_birth, date_at_age = format(seq(as.Date(date_birth, 
     "%d/%m/%Y"), length.out=3, by = "1 day"), "%d/%m/%Y")) , 
      by = Name][,age := seq_len(.N)-1 , by = Name][] 
# Name date_birth date_at_age age 
#1: Greg 01/02/2015 01/02/2015 0 
#2: Greg 01/02/2015 02/02/2015 1 
#3: Greg 01/02/2015 03/02/2015 2 
#4: Fred 02/02/2015 02/02/2015 0 
#5: Fred 02/02/2015 03/02/2015 1 
#6: Fred 02/02/2015 04/02/2015 2 
+0

我已经与上述成功。我也试图计算怀孕的年龄(和相关日期)。假设在出生前290天开始怀孕,怀孕年龄(天)= 290 +(怀孕日期 - 出生日期)。我用下面的代码来计算怀孕年龄,但结果值是负值。有没有办法让他们积极? (data.table) setDT(df)[,。(date_birth,date_at_pregage = format(seq(as.Date(date_birth, “%d /%m /%Y”),length.out = 291, =“-1天”),“%d /%m /%Y”)), by = name] [,preg_age:= seq_len(.N)-291,by = name] [] – ElTenero

+1

上述问题解决,我用abs(df2 $ preg_age) – ElTenero

0

这是获得该data.table会带你去同一个地方的一个长形的方式。

看看你如何在R中使用日期。我已经采取了你的原始格式并将其转换为日期(代码行2)。有关更多代码,请参阅http://strftime.org/

设置一些虚拟的数据:

df = data.frame(name=c("Gregg", "Joan"), DOB=c("01/02/2015", "02/02/2015"), stringsAsFactors=F) 

制造日期格式:

df$DOB = as.Date(df$DOB, format="%d/%m/%Y") 

循环每个名字,使得301点的实例,并加入天DOB

df = lapply(1:nrow(df), function(i){ 
    x = data.frame(name=rep(df[i, 1], times=301), 
        DoB=rep(df[i, 2], times=301), 
        age=0:300) 
    x$newDate = x$DoB + x$age 
    x 
}) 

转换列表一个数据帧:

df = do.call("rbind.data.frame", df) 

检查输出:

head(df) 
0

设置

df <- cbind(c("Greg","Fred"),c("01/02/2015","02/02/2015")) 
max_age <- 2 
start_at <- 0 

脚本

new_df <- data.frame(rep(NA,(max_age+1)*dim(df)[1])) 
new_df[,1] <- rep(df[,1],each=max_age-start_at+1) #Names 
new_df[,2] <- rep(df[,2],each=max_age-start_at+1) #Birth date 
new_df[,3] <- rep(seq(from=start_at,to=max_age),dim(df)[1]) #Age 
library(lubridate) 
new_df[,4] <- dmy(new_df[,2]) + days(new_df[,3]) #Date at age 
colnames(new_df) <- c("names","date_birth","age","date_at_age")