2016-07-07 1 views
2

2つの要因でグループ分けされたデータフレームがあります。 dplyrでデータのグループをサンプリングする方法はありますか? (注:ないサンプル内のグループ)グループ化されたデータフレーム(dplyr)のデータグループをサンプリングする方法はありますか

例:おそらく

DF <- data.frame(A = rep(LETTERS[1:4], each = 6), 
       B = rep(c(1:2), 12), 
       C = rnorm(24)) 

# base r solution 

DF$group_var <- paste(DF$A, DF$B, sep = "_") 
DF_sample <- DF[DF$group_var %in% sample(unique(DF$group_var), 3), ] 

#possible dplyr solution? 

DF_sample <- DF %>% group_by(A,B) %>% sample_group_of_data(3) 
+0

私は '%DF%>%filter(%sampleのgroup_var%(一意(DF $ group_var)、3、replace = F))と仮定しています)' dplyr-oïdは十分ですか? –

+0

私は恐れていません:-)私はまだグループ化変数を作成し、 '手動で'サンプルする必要があります。唯一の 'dplyr'の追加はグループ化変数の作成を避けるため' '' '' '' ' – Latrunculia

答えて

4

は、ここでは、データがグループ化されているかどうかにかかわらず動作しますが、別のパイプソリューションです:

DF %>% split(interaction(.$A, .$B)) %>% sample(3) %>% bind_rows() 
# Source: local data frame [9 x 3] 
# 
#  A  B   C 
# (fctr) (int)  (dbl) 
# 1  B  1 0.2623781 
# 2  B  1 -0.8193225 
# 3  B  1 0.3348400 
# 4  D  1 1.0744650 
# 5  D  1 1.3528529 
# 6  D  1 0.3016770 
# 7  A  2 -0.1920754 
# 8  A  2 0.6917583 
# 9  A  2 0.1985326 

パイプ自体はかなり自明ですが、私は信じています。

+0

これは非常に洗練されたソリューションです!私は答えとしてそれを受け入れる。 – Latrunculia

2

ないあなたが思っているだろうと、それは一種の不正行為だが、ここに私の解決策だとしてかなり:

DF %>% group_by(A, B) %>% 
    magrittr::extract(unlist(sample(attr(., "indices"), 5))+1,) 

私はリスト内のグループのインデックスを与える "indices"属性を使用します。私はこのリストをサンプルし、それをリストから外して1を加えます(それらのインデックスは0から始まるようです)。

次に、[]演算子を表すmagrittr抽出関数を使用します。その意味で私は効率的に不正行為をしています。問題をパイプで書き直し、グループ化されたdplyrの属性を使用しています。

+0

+1 'は私が' 'magrittr:extract'について知りませんでしたので' 'フィルタ' 'ですが、どちらか。その機能が存在しないようだとすれば、それは有用な機能でしょうか? – Latrunculia

1

私が必要としているのは、Vincentの解答です。私は追加の答えとしてそれを追加しています。

DF %>% filter(group_var %in% sample(unique(DF$group_var), 3, replace = F)) 

ヴィンセント、私はあなたに+1しています。

関連する問題