2017-03-10 9 views
2

リージョンごとに1つのランダムなサイトを作成し、新しいデータフレームを作成してすべてのサイトがサンプリングされるまでこれらのプロセスを繰り返します。したがって、各データフレームには同じ地域の同じサイトが含まれません。グループごとに無作為にサンプリングし、グループ内のすべてのエンティティがサンプリングされるまで、新しいデータフレームを作成します。

私の実際のデータフレームのいくつかのリージョンには、他のリージョンより多くのサイト(リージョンCのサイトが4つあります)があります。私はそれらの行を削除したい(おそらく私は複数のデータフレームを作成する前にこれを行う必要があります)。ここ

は、例えばデータフレーム(実際の一つは> 100の領域およびリージョンあたり> 10の部位を有する)である:3回以下のコードを繰り返す

mydf <- read.table(header = TRUE, text = 'V1 V2 Region Site 
5 1 A X1 
5 6 A X2 
8 9 A X3 
2 3 B X1 
3 1 B X2 
7 8 B X3 
1 2 C X1 
9 4 C X2 
4 5 C X3 
6 7 C X4') 

は、所定のための同じ部位を含むデータフレームを生成しますリージョン(2番目と3番目のテーブルの両方にリージョンAのサイトX2があります)。

do.call(rbind, lapply(split(mydf, mydf$Region), function(x) x[sample(nrow(x), 1), ])) 

    V1 V2 Region Site 
A 8 9  A X3 
B 2 3  B X1 
C 6 7  C X4 

V1 V2 Region Site 
A 5 6  A X2 
B 7 8  B X3 
C 9 4  C X2 

    V1 V2 Region Site 
A 5 6  A X2 
B 3 1  B X2 
C 6 7  C X4 

あなたは、すべてのデータフレームがすべての領域が含まれていますが、各データフレームは独自の地域サイトの組み合わせを含むように私は、複数のデータフレームを作成して助けてくださいでした。

EDIT:ここに出力があります。これらを生成するには、最初のサンプリングで、各リージョンからランダムに1つのサイト(行)を引き出し、データフレームを作成します。 2回目のサンプリングでは、同じプロセスを繰り返しますが、特定のリージョンの同じサイトを描画することはできません。私が望むのは、Region-Siteのユニークな組み合わせを含む独立したデータフレームです。

V1 V2 Region Site 
5 1 A X1 
7 8 B X3 
1 2 C X1 

V1 V2 Region Site 
5 6 A X2 
3 1 B X2 
4 5 C X3 

V1 V2 Region Site 
8 9 A X3 
2 3 B X1 
9 4 C X2 
+0

Rコーディングについての質問は、ここでは一般的に話題にはなりません。私はこれが[SO]の話題になると思う。あなたが待っているなら、私たちはそれをそこに移そうとすることができます。 – gung

+0

申し訳ありません。それを移行していただきありがとうございます。 –

+0

期待される出力を表示できますか? – akrun

答えて

0

偉大data.tableパッケージは実際に実際には、この非常に簡単

# Turn mydf into a data.table 
library(data.table) 
setDT(mydf) 

# Shuffle the rows of the table 
dt <- dt[sample(.N)] 

# In case there are multiple rows for a given Region <-> Site pair, 
# eliminate duplicates. 
dt <- unique(dt, by = c('Region', 'Site')) 

# Get the first sample from each region group 
# Note: .SD refers to the sub-tables after grouping by Region 
dt[, .SD[1], by=Region] 

# Get the second and third sample from each region group 
dt[, .SD[2], by=Region] 
dt[, .SD[3], by=Region] 

を作るフランクはそれが働い

library(data.table) 
dt <- setDT(mydf) 
dt <- unique(dt, by = c('Region', 'Site')) 
dt[sample(.N), .SD[1:3], by = Region] 
+0

「重複を排除する」ステップは 'unique'でも実行できます。 OPはちょうど1地域あたり3つのサイトを望んでいるので、後の部分を再、おそらく 'dt [、.SD [1:3]、by = Region]'副次的なこととして、デバッグするのが難しいので、 'dt < - 'を上書きするのは悪い習慣だと思います。 – Frank

+0

OPのための明快な強調。ワンライナーも追加されました。 – andrew

+0

よかった、ワンライナー。 Btw、明らかにする。 'dt < - dt [...]'は、コードをあまり明確にしません。なぜなら、そのようなステップの前に 'dt'がどのように見えるかを知りたいのであれば、コードを上から再度実行する必要があるからです。より簡単なのは 'newdt < - dt [...]'でしょう。別のポイント: 'setDT'で、割り当てる必要はありません。 'mydf'は参照によって変更されたdata.tableそのものになりました。 – Frank

0

を示唆したように、あなたはワンライナーに結合することができます!私は答えを受け入れるためのチェックマークがないので、私はここでやっています。

関連する問題