【问题标题】:generate list of dates based on one date in r根据 r 中的一个日期生成日期列表
【发布时间】:2016-07-12 08:54:44
【问题描述】:

我是 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 天。

【问题讨论】:

  • 你的年龄是从哪里来的,还是只是加一?
  • 是的,它只是增加 1 天。但我希望生成的列表从 1 天到 300 天。所以基本上为每个人生成 300 个新行。

标签: r date add rows


【解决方案1】:

我们可以使用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

【讨论】:

  • 我在上面取得了成功。我还尝试计算怀孕年龄(和相关日期)。假设怀孕在出生前 290 天开始,怀孕年龄(天)= 290 +(怀孕日期 - 出生日期)。我使用下面的代码来计算怀孕年龄,但结果值为负。有没有办法让他们变得积极? library(data.table) setDT(df)[, .(date_birth, date_at_pregage = format(seq(as.Date(date_birth, "%d/%m/%Y"), length.out=291, by = "- 1 天"), "%d/%m/%Y")) , by = name][,preg_age := seq_len(.N)-291 , by = name][]
【解决方案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)

【讨论】:

    【解决方案3】:

    设置

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2021-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多