Повторная выборка по номеру подряд в R - PullRequest
1 голос
/ 18 марта 2020

У меня есть вопрос, и я постараюсь объяснить его как можно лучше.

Допустим, у меня есть следующий набор данных, назовем его extra_events:

   Year WEvents
     1       1
     2       3
     3       1
     4       2
     5       3
     6       0
     7       3
     8       0
     9       2
    10       3

и у меня есть другой набор данных, назовем его weather_loss:

  Event Loss
    11    2
    21    3
    24    5
    27    8
    30   10
    34    7
    37    1
    41   14
    45   15

Моя цель - случайная выборка из weather_loss (столбца событий) в каждую строку из extra_events столько раз, сколько в столбце Wevents (с заменой курса)

так, например, выходные данные будут выглядеть следующим образом:

   Year Wevents Sim1 Sim2 Sim3
     1       1   21   NA   NA
     2       3   24   30   37
     3       1   11   NA   NA
     4       2   45   41   NA
     5       3   30   34   37
     6       0   NA   NA   NA
     7       3   24   27   34
     8       0   NA   NA   NA
     9       2   37   45   NA
    10       3   11   21   30

Таким образом, я могу видеть за каждый год, сколько событий мне нужно выбрать и какие события были выбраны.

Может ли кто-нибудь помочь мне, как выполнить sh это. Мне не обязательно, чтобы там было АН.

1 Ответ

0 голосов
/ 18 марта 2020

Вот один вариант с 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...