データをN個の等しいグループに分割


11

4つの列の値を含むデータフレームがあります。

たとえば、次のようにIDpriceclick countrating

私がしたいのは、このデータフレームをN個の異なるグループに「分割」して、各グループが同じ分布の価格、クリック数、および評価属性を持つ同じ数の行を持つことです。

私はこれに取り組む方法について少しの考えもないので、アドバイスは強く感謝します!


オリジナルのばらばらのサブセットであるN個の個別のデータフレームを作成することを検討していますか?価格、クリック数、評価の「同じ分布」とはどういう意味ですか?
Alex A.

はい、元のデータフレームのサブセットを探しています。2番目の質問で、1から10までの訪問数の値があり、3つの異なるサブセットを作成することにしたため、1から4までの訪問数バケット、4から7までの訪問数バケットからいくつかの行を選択し、 7から10までの訪問カウントバケットがあり、これはすべての属性(価格、クリック数、評価)に関して満足する必要があります。これは、属性の確率が等しい複数のグループにデータをサンプリングするようなものです。お役に立てれば。


質問は、変数の分布を保存する分割を要求します。これ以上の情報がなければ、この問題に取り組むための正しい方法を決定することは不可能です。これをCV.comに移行することを投票
DWin

マージナル分布またはジョイント分布のみを保持することを意味しますか?
kjetil b halvorsen 2018

回答:


12

私が質問を正しく理解していれば、これはあなたが望むものを手に入れます。あなたのデータフレームが呼び出されると仮定するdfと、あなたがしているN定義された、あなたはこれを行うことができます。

split(df, sample(1:N, nrow(df), replace=T))

これは、各データフレームがからランダムに選択された行で構成されるデータフレームのリストを返しdfます。デフォルトでsample()は、各グループに等しい確率が割り当てられます。


6

これは非常に遅い回答ですが、私はこのページを、述べられた問題がどこかで議論されたことがあるかどうかグーグルしながら見つけました。これから誰かがこのページを見つけた場合、私の答えが役立つかもしれません。

私はRパッケージdata.frameを作成しました。これは、質問が要求したとおりのことを行います。1つまたは複数の基準でグループ間の違いを最小限に抑えながら、a を使用してN個の異なるグループを作成します。これは、ランダムな割り当ての繰り返しに基づく簡単な方法を使用します。これは、承認された応答で推奨される方法でもあります。

これはパッケージminDiffへのリンクです

述べられた問題に取り組むために、あなたは使うことができました:

library(minDiff)
assigment <- create_groups(dataframe, criteria_scale = c("price", "click count", "rating"), sets_n = N, repetitions = 1000)

このrepetitions議論により、さまざまなグループをランダムに作成する頻度が決まります。最良の割り当て(グループ間の違いが最小限の割り当て)が返されます。


5

Alex Aの回答は各グループに等しい確率を与えますが、グループが同じ行数を持つという質問の要求には応えません。R:

stopifnot(nrow(df) %% N == 0)
df    <- df[order(runif(nrow(df))), ]
bins  <- rep(1:N, nrow(df) / N)
split(df, bins)

3
受け入れられた回答の不備についてのあなたの観察は良いものです。しかし、あなたの答えはまだ興味のある質問の部分には対応していません(そして、ここで閉じられなかった唯一の理由です):各グループで「価格、クリック数、および評価属性の同じ分布」をどのように達成しますか?
whuber

@whuberここでそれに対する答えを提案できますか?
レオ・レオポルド・ヘルツ준 영

その答えは、「同じ分布」が何を意味するかに依存するべきです。質問がして求めている見えるクラスタの各クラスタは観測値の数が同じで、4つの変数に基づいて観測を。これを行う方法は無数にあります。
whuber

0

これはtidyr / dplyrを使用してネストすることで解決できます

require(dplyr) 
require(tidyr)

num_groups = 10

iris %>% 
   group_by((row_number()-1) %/% (n()/num_groups)) %>%
   nest %>% pull(data)
```
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.