2017-01-15 8 views
3

データフレームの行をグループごとにサンプリングしたいと思います。しかしここにキャッチがあります。別のテーブルのデータに基づいて、異なる数のレコードをサンプルしたいと思います。ここに私の再現性のあるデータである:dplyr tidyverseでグループごとに異なる行数をサンプリングする

df <- data_frame(
    Stratum = rep(c("High","Medium","Low"), 10), 
    id = c(1:30), 
    Value = runif(30) 
) 

sampleGuide <- data_frame(
    Stratum = c("High","Medium","Low"), 
    Surveys = c(3,2,5) 
) 

出力は次のようになります。ここでは

# A tibble: 10 × 2 
    Stratum  Value 
    <chr>  <dbl> 
1  High 0.21504972 
2  High 0.71069005 
3  High 0.09286843 
4 Medium 0.52553056 
5 Medium 0.06682459 
6  Low 0.38793128 
7  Low 0.01285081 
8  Low 0.87865734 
9  Low 0.09100829 
10  Low 0.14851919 

は私の非稼働の試み

> df %>% 
+ left_join(sampleGuide, by = "Stratum") %>% 
+ group_by(Stratum) %>% 
+ sample_n(unique(Surveys)) 
Error in unique(Surveys) : object 'Surveys' not found 

また

> df %>% 
+ group_by(Stratum) %>% 
+ nest() %>% 
+ left_join(sampleGuide, by = "Stratum") %>% 
+ mutate(sample = map(., ~ sample_n(data, Surveys))) 
Error in mutate_impl(.data, dots) : 
     Don't know how to sample from objects of class function 

であることはsample_nのように思えます要求するsizeは単一の番号にする必要があります。何か案は?

私はtidyverseソリューションをお探ししています。追加ポイントはpurrrです!

This同様の問題でしたが、私が扱っている地層の数が多いため、受け入れられた答えに満足できません。

答えて

4

purrr

df %>% 
    nest(-Stratum) %>% 
    left_join(sampleGuide, by = "Stratum") %>% 
    mutate(Sample = map2(data, Surveys, sample_n)) %>% 
    unnest(Sample) 
から map2()でそれを考え出しました
関連する問題