Dplyr: グループをサンプリングできる必要があります

作成日 2014年03月28日  ·  9コメント  ·  ソース: tidyverse/dplyr

グループ内の個人だけでなく

最も参考になるコメント

@drhagenによる上記の回答は、

sample_n_groups = function(tbl, size, replace = FALSE, weight = NULL) {
  # regroup when done
  grps = tbl %>% groups %>% lapply(as.character) %>% unlist
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% ungroup() %>% sample_n(size, replace, weight)
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(.dots = grps)
}

全てのコメント9件

species <- iris %.% 
  group_by(Species) %.% 
  summarise(wt = sum(Sepal.Length)) %.%
  sample_n(5, replace = T, weight = wt) %.%
  select(-wt)

inner_join(species, iris)

なぜこれが閉鎖されたのだろうか? 潜在的に有用な機能のようです

iris %>%
    group_by(Species) %>%
    sample_n(1)

ランダムな種からすべてのデータを選択します。

グループ内でのサンプリングは直感的な動作であるため、グループのsample_nの動作は変更されるべきではないと思います。 ただし、グループ全体をサンプリングできると便利なことがよくあります。 これは2番目の関数である必要があります。 これが私の実装です:

sample_n_groups = function(tbl, size, replace = FALSE, weight=NULL) {
   # regroup when done
   grps = tbl %>% groups %>% unlist %>% as.character
   # check length of groups non-zero
   keep = tbl %>% summarise() %>% sample_n(size, replace, weight)
   # keep only selected groups, regroup because joins change count.
   # regrouping may be unnecessary but joins do something funky to grouping variable
   tbl %>% semi_join(keep) %>% group_by_(grps) 
}

@rcortyによる例は期待どおりに機能します

iris %>% group_by(Species) %>% sample_n_groups(1)

+1

編集: dplyrへの変更は、このソリューションを壊しました。


この機能を探して検索エンジン経由でここに到着した方のために、 @ MarcusWalzによるreplace = TRUE場合の置換でサンプリングされません。 実装では、重複を保持するためにright_join (またはleft_joinまたはinner_join )を使用する必要があります。

sample_n_groups = function(tbl, size, replace = FALSE, weight=NULL) {
  # regroup when done
  grps = tbl %>% groups %>% unlist %>% as.character
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% sample_n(size, replace, weight)
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(grps) 
}

クラスターのブートストラップは、この機能の幅広いユースケースです。

@drhagen 、あなたの実装では、新しい一意のグループIDを生成する方法について何か提案がありますか?

実際、これは非常に簡単です。

sample_n_groups = function(tbl, size, replace = FALSE, weight=NULL) {
  # regroup when done
  grps = tbl %>% groups %>% unlist %>% as.character
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% sample_n(size, replace, weight) %>% 
    mutate(unique_id = 1:NROW(.))
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(grps) 
}

@drhagenによる上記の回答は、

sample_n_groups = function(tbl, size, replace = FALSE, weight = NULL) {
  # regroup when done
  grps = tbl %>% groups %>% lapply(as.character) %>% unlist
  # check length of groups non-zero
  keep = tbl %>% summarise() %>% ungroup() %>% sample_n(size, replace, weight)
  # keep only selected groups, regroup because joins change count.
  # regrouping may be unnecessary but joins do something funky to grouping variable
  tbl %>% right_join(keep, by=grps) %>% group_by_(.dots = grps)
}
このページは役に立ちましたか?
0 / 5 - 0 評価