【问题标题】:How to construct a random data set of different year in R?如何在R中构建不同年份的随机数据集?
【发布时间】:2020-10-30 15:39:47
【问题描述】:

下面的代码将在 2009 年的每日时间步长上生成均匀分布的数据。假设我想构建一个类似的数据集,其中包括 2009、2012、2015 和 2019 年,我该怎么做?.我基本上是在尝试避免重复代码或使用过滤器来获取感兴趣的年份的数据。

library(tidyverse)
library(lubridate)

set.seed(500)
DF1 <- data.frame(Date = seq(as.Date("2009-01-01"), to = as.Date("2009-12-31"), by = "day"),
                  Flow = runif(365,20,60))

【问题讨论】:

    标签: r dataframe time-series tidyverse random-data


    【解决方案1】:

    这是一个选项,我们创建一个vector of year,循环遍历vector,在转换为Date 类后获取日期序列,并从均匀分布中创建“流”

    year <- c(2009, 2012, 2015, 2019)
    lst1 <- lapply(year, function(yr) {
         dates <- seq(as.Date(paste0(yr, '-01-01')), 
                      as.Date(paste0(yr, '-12-31')), by = 'day')
         data.frame(Date = dates, 
          Flow= runif(length(dates), 20, 60))
       })
    

    并使用do.call 创建单个data.frame

    dat1 <- do.call(rbind, lst1)
    

    【讨论】:

    • 感谢@akrun,我们如何将其放入第一列是Dates,另一列是Flow 的data.frame(按顺序,即2009 年的第一个数据,然后是2012,等等)?
    • @Hydro,使用do.call(rbind, lst1)
    【解决方案2】:

    这是一个可能的解决方案:

    set.seed(123)
    sample_size <- 1000
    
    y <- sample(c(2009,2012,2015,2019),sample_size,replace=TRUE)
    simulate_date <- function(year){
      n_days <- ifelse(lubridate::leap_year(year),
                       366,365)
      as.Date(sample(1:n_days, 1), origin=paste0(year,"-01-01"))
    }
    
    dates <- Reduce(`c`, purrr::map(y, simulate_date))
    
    > head(dates)
    [1] "2012-06-28" "2012-01-15" "2009-07-15" "2012-11-02" "2019-04-29"
    [6] "2015-10-27"
    

    【讨论】:

    • 谢谢 - 2012 年多了一天(闰年)。您的代码确实有帮助,可能需要进一步调整?
    • @Hydro 我会调整并告诉你
    猜你喜欢
    • 1970-01-01
    • 2022-12-29
    • 2020-02-12
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-23
    • 1970-01-01
    相关资源
    最近更新 更多