我的数据如下所示:
> data|>head(20)|>dput()
structure(list(id = c("42190204", "34390202", "34310104", "34310104",
"34310104", "34310104", "34310104", "34310104", "34310104", "34310104",
"34310104", "34310104", "34310104", "34310104", "34310104", "34310104",
"34310104", "34310104", "34310104", "34310104"), sample_size = c(0,
7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA,
20L), class = "data.frame")
此外,我的数据在sample_size中有NA,我正在过滤掉它们。对于某些 id,我有多达 800 多个观察值,因此在某些情况下,我的样本大小大于组 id 的可用观察值数量,而在某些情况下,我的样本大小小于观察值数量。在第一种情况下,理想的情况是重复现有的观察结果来组成样本大小,而在第二种情况下,只需随机选择观察结果。
从每个组(即 id 列)中,我需要随机选择等于该组(= id)的样本大小的观察数量。
我正在查看这个答案并尝试使用
nest()
,但它不起作用..代码完成时没有错误,但每组下的观察数与样本大小不匹配...如何解决这个问题?
我的代码:
test<-data|>filter(!is.na(sample_size))|>nest(id)|>
mutate(
data_sample = map2(data, sample_size, ~ slice_sample(.x, n = .y))
) %>%
unnest(cols = data_sample)
如果您不嵌套
id
列(有一个示例 val
列可以从此处进行采样),它就可以工作:
library(tidyverse)
n_samples <- tibble(
id = 1:100,
sample_size = sample(0:4, 100, replace = TRUE)
)
tibble(id = rep(1:100, each = 100),
value = runif(10000, 10, 100)) |>
left_join(n_samples, by = join_by(id)) |>
nest(data = value) |>
mutate(data_sample = map2(data, sample_size, ~ slice_sample(.x, n = .y))) |>
unnest(data_sample) |>
select(-data)
#> # A tibble: 188 × 3
#> id sample_size value
#> <int> <int> <dbl>
#> 1 1 2 26.5
#> 2 1 2 50.8
#> 3 2 3 67.8
#> 4 2 3 29.1
#> 5 2 3 83.6
#> 6 3 4 24.9
#> 7 3 4 60.1
#> 8 3 4 37.4
#> 9 3 4 81.6
#> 10 4 4 85.2
#> # ℹ 178 more rows