2017-10-30 7 views
0

パネルデータセットに対して手動でブートストラップを行いたい。私は後の操作の一貫性を確認するために、つまり、同じ個人のすべての観測をブートストラップサンプルで選択する必要があることを確認するために、個々のレベルでクラスタリングする必要があります。私がしているのは、索引として使用される一意の個別IDのベクトル上の置換えによるリサンプリングを行うことです。R:リサンプリング後にグループごとに行を選択

df <- data.frame(ID = c("A","A","A","B","B","B","C","C","C"), v1 = c(3,1,2,4,2,2,5,6,9), v2 = c(1,0,0,0,1,1,0,1,0)) 

boot.index <- sample(unique(df$ID), replace = TRUE) 

その後、私はboot.index = (B, B, C)を想定、インデックスに応じて行を選択し、私はどうやらdf1 <- df[df$ID == testboot.index,]私が欲しいものを与えるものではありません。この

ID v1 v2 
B 4 0 
B 2 1 
B 2 1 
B 4 0 
B 2 1 
B 2 1 
C 5 0 
C 6 1 
C 9 0 

のようなデータフレームを持っていると思います。私はsubsetfilterdplyrに試しましたが、何も動作しません。基本的に、これはグループインデックス、すべての提案でグループ全体を選択する問題ですか?ありがとう!

答えて

0
set.seed(42) 
boot.index <- sample(unique(df$ID), replace = TRUE) 
boot.index 
#[1] C C A 
#Levels: A B C 

do.call(rbind, lapply(boot.index, function(x) df[df$ID == x,])) 
# ID v1 v2 
#7 C 5 0 
#8 C 6 1 
#9 C 9 0 
#71 C 5 0 
#81 C 6 1 
#91 C 9 0 
#1 A 3 1 
#2 A 1 0 
#3 A 2 0 
+0

の順番は重要ではありません。実際には 'C C A'でも 'C C 'でも問題ありません。 – DXC

0

%in%関連する行を選択すると、目的の出力が得られます。

> df 
    ID v1 v2 
1 A 3 1 
2 A 1 0 
3 A 2 0 
4 B 4 0 
5 B 2 1 
6 B 2 1 
7 C 5 0 
8 C 6 1 
9 C 9 0 
> boot.index 
[1] A B A 
Levels: A B C 
> df[df$ID %in% boot.index,] 
    ID v1 v2 
1 A 3 1 
2 A 1 0 
3 A 2 0 
4 B 4 0 
5 B 2 1 
6 B 2 1 

dplyr::filterベースのソリューション:

> df %>% filter(ID %in% boot.index) 
    ID v1 v2 
1 A 3 1 
2 A 1 0 
3 A 2 0 
4 B 4 0 
5 B 2 1 
6 B 2 1 
+0

@amrrsが半分に行わが、私はまだグループの後にグループの繰り返しを必要としますB – DXC

+0

@amrrsはい、それはブートストラップのポイントです - サンプルを使って再サンプリングするので、いくつかの観測はm一度より鉱石。 – DXC

+0

これはインデックスに基づいていますか?あなたはAを2回持っていて、それはいいえを繰り返すのですか? – amrrs

0

あなたも参加してこれを行うことができます。

boot.index = c("B", "B", "C") 
merge(data.frame("ID"=boot.index), df, by="ID", all.x=T, all.y=F) 
+0

@ ags29ありがとうございます。あなたの答えはスマートですが、私は同じデータフレーム上で直接操作して新しいものを作成してマージする方が好きなので、d.bの答えを受け入れます。 – DXC

関連する問題