2016-05-20 19 views
1

私が欲しいものは次のように記述することができます:データフレームを与え、すべてのケースコントロールペアが含まれています。次の例では、yはケースコントロールペアのIDです。私のデータセットには3組あります。私は、yの異なる値に関してリサンプリングを行っています(ペアはどちらも選択されているか、どちらも選択されていません)。今重複した値を持つベクトルに基づいて、データフレームの行を選択してください。

sample_df = data.frame(x=1:6, y=c(1,1,2,2,3,3)) 
> sample_df 
    x y 
1 1 1 
2 2 1 
3 3 2 
4 4 2 
5 5 3 
6 6 3 
select_y = c(1,3,3) 
select_y 
> select_y 
[1] 1 3 3 

、私は、ベクターは、私が上記select_yである、リサンプリングするペアが含まれて計算されています。これは、症例対照ペア番号1が私の新しいサンプルにあり、番号3も新しいサンプルにあることを意味するが、2つで3回あるので、2回発生する。

私は...

ソリューションforループを書くよりも、他の効率的な方法を見つけることができません。 @HubertLをもとに、いくつかの修正を加えて、「ベクトル化」アプローチは次のようになります。

sel_y <- as.data.frame(table(select_y)) 
> sel_y 
    select_y Freq 
1  1 1 
2  3 2 
sub_sample_df = sample_df[sample_df$y%in%select_y,] 
> sub_sample_df 
    x y 
1 1 1 
2 2 1 
5 5 3 
6 6 3 
match_freq = sel_y[match(sub_sample_df$y, sel_y$select_y),] 
> match_freq 
    select_y Freq 
1   1 1 
1.1  1 1 
2   3 2 
2.1  3 2 
sub_sample_df$Freq = match_freq$Freq 
rownames(sub_sample_df) = NULL 
sub_sample_df 
> sub_sample_df 
    x y Freq 
1 1 1 1 
2 2 1 1 
3 5 3 2 
4 6 3 2 
selected_rows = rep(1:nrow(sub_sample_df), sub_sample_df$Freq) 
> selected_rows 
[1] 1 2 3 3 4 4 
sub_sample_df[selected_rows,] 
    x y Freq 
1 1 1 1 
2 2 1 1 
3 5 3 2 
3.1 5 3 2 
4 6 3 2 
4.1 6 3 2 

答えて

1

ループせずに同じことを行うための別の方法:

sample_df = data.frame(x=1:6, y=c(1,1,2,2,3,3)) 

row_names <- split(1:nrow(sample_df),sample_df$y) 

select_y = c(1,3,3) 

row_num <- unlist(row_names[as.character(select_y)]) 

ans <- sample_df[row_num,] 
+0

私はそれがよりよい解決策だと言わざるを得ません。それはスプリットの良い使用です。 –

0

私はループのない道を見つけることができませんが、少なくともそれはではありませんループは、周波数ごとに1つだけの反復があります:

sample_df = data.frame(x=1:6, y=c(1,1,2,2,3,3)) 
select_y = c(1,3,3) 
sel_y <- as.data.frame(table(select_y)) 
do.call(rbind, 
     lapply(1:max(sel_y$Freq), 
       function(freq) sample_df[sample_df$y %in% 
           sel_y[sel_y$Freq>=freq, "select_y"],])) 

    x y 
1 1 1 
2 2 1 
5 5 3 
6 6 3 
51 5 3 
61 6 3 
+0

ええ、それは私が今やっているものに似ています。大規模なデータセットの場合、速度は依然として懸念されます。私はより良い方法は、ペアの周波数を表すfreq変数を作成することだと思っています。例えば、私は最初にペア1と3を選択する必要があると判断し、3回選択する必要があると判断したら、freq = rep(c(1,3)、c(1,2))のようにします。この。そして、sample_df [freq、]はその仕事をします。しかし、効率的な方法はありません。 –

+0

私の編集@JiangDuを参照してください、それはあなたのヒントに基づいて – HubertL

+0

より速くすべきです、私はより良いものを考え出すと思います。上記を参照。ありがとう、チームの仕事。 @HubertL –

関連する問題