r - 根据R中一行中的数字重复采样
问题描述
我有一个问题,我会尽力解释它。
假设我有以下数据集,我们称之为 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
我的目标是从 weevents 列中随机抽取 weather_loss (事件列)到 extra_events 的每一行(当然要替换)
例如,输出将如下所示:
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
通过这种方式,我可以看到每年我必须采样多少事件以及采样了哪些事件。
谁能帮我解决这个问题。我不一定需要有 NA。
解决方案
这是一个选项tidyverse
,我们循环覆盖“WEvents”,sample
“事件”基于“WEvents”中的值,作为list
列返回,然后使用unnest_wider
frompurrr
创建多个列
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))
数据
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))
推荐阅读
- sql - 偏移量 | FETCH 按列排序 - SQL Server
- pandas - 根据一组列中的条件选择行
- git - android studio中文件名前出现一个数字图标
- android - PorterDuffColorFilter 更改了我的 recyclerview 中的所有图标
- robotframework - 在机器人框架上重启机器
- php - 如何将数据从 PHP Laravel 传递到 Vue.js 并在数据更改时重新渲染 Vue.js 组件?
- python - 当我更改变量的值时,我总是需要重新启动内核
- javascript - 引导选择选择器选项始终处于选中状态
- jenkins - 詹金斯/凹槽 - 显示所有阶段失败的动态阶段
- join - 有没有比在 Proc SQL 中使用一对多连接更快的方法来生成所需的输出?