根据 r 中的一个日期生成日期列表
generate list of dates based on one date in 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-blogger、一般教学博客和这个网站这样的网站,我一直在尝试找出一个涉及 Seq 语句的循环语句,以便对每个人(例如 Greg、Fred 等)可以重复该过程,计算日期并将其放在自己的行中。您的第一个想法可能是这在 Excel 中更简单,但事实并非如此,因为我需要对超过 800 个人(即不仅仅是 Greg 和 Fred)重复此操作,并且长达 300 天年龄
我们可以使用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
这是到达 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)
设置
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")
我是 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-blogger、一般教学博客和这个网站这样的网站,我一直在尝试找出一个涉及 Seq 语句的循环语句,以便对每个人(例如 Greg、Fred 等)可以重复该过程,计算日期并将其放在自己的行中。您的第一个想法可能是这在 Excel 中更简单,但事实并非如此,因为我需要对超过 800 个人(即不仅仅是 Greg 和 Fred)重复此操作,并且长达 300 天年龄
我们可以使用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
这是到达 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)
设置
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")