グループ内の個人だけでなく
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)
}
最も参考になるコメント
@drhagenによる上記の回答は、