Вот один вариант с tidyverse
, где мы l oop перекрываем 'WEvents', а sample
'Событие' на основе значения в 'WEvents', возвращаем в виде столбца list
и затем используем unnest_wider
из purrr
для создания нескольких столбцов
library(dplyr)
library(purrr)
extra_events %>%
mutate(Sim = map(WEvents, ~ sample(weather_loss$Event, .x) %>%
as.list)) %>%
unnest_wider(c(Sim)) %>%
rename_at(vars(starts_with('..')), ~ str_c('Sim', seq_along(.)))
# A tibble: 10 x 5
# Year WEvents Sim1 Sim2 Sim3
# <int> <int> <int> <int> <int>
# 1 1 1 37 NA NA
# 2 2 3 24 37 41
# 3 3 1 30 NA NA
# 4 4 2 34 30 NA
# 5 5 3 45 21 11
# 6 6 0 NA NA NA
# 7 7 3 37 11 34
# 8 8 0 NA NA NA
# 9 9 2 27 24 NA
#10 10 3 45 27 11
Или с использованием base R
lst1 <- lapply(extra_events$WEvents, function(x) sample(weather_loss$Event, x))
mx <- max(lengths(lst1))
extra_events[paste0("Sim_", seq_len(mx))] <- do.call(rbind,
lapply(lst1, `length<-`, mx))
data
extra_events <- structure(list(Year = 1:10, WEvents = c(1L, 3L, 1L, 2L, 3L, 0L,
3L, 0L, 2L, 3L)), class = "data.frame", row.names = c(NA, -10L
))
weather_loss <- structure(list(Event = c(11L, 21L, 24L, 27L, 30L, 34L, 37L, 41L,
45L), Loss = c(2L, 3L, 5L, 8L, 10L, 7L, 1L, 14L, 15L)),
class = "data.frame", row.names = c(NA,
-9L))