2016-07-12 2 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 + (дата во время беременности - дата рождения). Я использовал приведенный ниже код для расчета возраста беременности, но результирующие значения отрицательные. Есть ли способ сделать их позитивными? библиотека (данные.таблица) setDT (df) [,. (Date_birth, date_at_pregage = format (seq (as.Date (date_birth, "% d /% m /% Y"), length.out = 291, by = "-1 day"), "% 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 

Script

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")