Как построить случайный набор данных разного года в R? - PullRequest
1 голос
/ 10 июля 2020

Приведенный ниже код будет генерировать равномерно распределенные данные с ежедневным шагом по времени для 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))

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Вот возможное решение:

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"
1 голос
/ 10 июля 2020

Вот вариант, в котором мы создаем vector года, l oop поверх vector, получаем последовательность дат после преобразования в класс Date и создаем 'Flow' из равномерного распределения

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

и создайте один data.frame с помощью do.call

dat1 <- do.call(rbind, lst1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...