2016-07-12 3 views
0

私はRを初めて使い、生成された各行が計算された日付を持つ一連の行を生成することは困難です。以下を生成する...は、rの1つの日付に基づいて日付のリストを生成します

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人以上(GregとFredだけではない)と300日齢まで繰り返す必要があるためではありません。

+0

どこから年齢を得ている、またはそれだけで1ずつ増加しますか? – MikeRSpencer

+0

はい、単純に1日増分します。しかし、私は生成されたリストが1日から300日の年齢になるようにしたいと思います。だから、基本的には、各個人のために300の新しい行を生成する。 – ElTenero

答えて

3

私たちは、これは行くことができますdata.table同じ場所を得るための長い形式の方法です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 +(妊娠日 - 出生日)。私は妊娠年齢を計算するために以下のコードを使用しましたが、結果の値はマイナスです。それらをポジティブにする方法はありますか? setDT(df)[、。日付_出典:フォーマット(seq(日付)、日付。日付、生年月日、 、%d /%m /%Y)、length.out = 291、 %、%d /%m /%Y))、 by = name] [、preg_age:= seq_len(.N)-291、by = name] [] – ElTenero

+1

上記の問題を解決しました、私はabs(df2 $ preg_age)を使用しました。 – ElTenero

0

を使用することができます。

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") 
関連する問題