2016-07-12 233 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")