对每组预定义数量的观察进行采样

问题描述 投票:0回答:1

我的数据如下所示:

> 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)
r tidyverse nest sampling
1个回答
0
投票

如果您不嵌套

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
© www.soinside.com 2019 - 2024. All rights reserved.