2016-10-01 7 views
1

xの長さがnのxの文字列と一致するy行からn行を選択したいが、y行の同じ行を複数回選択しないでください。行はyからランダムに選択する必要があります。一意の行だけを取得するために置換なしでマージ

> head(x$Age_Yrs_Sex) 
[1] "65_0" "72_1" "82_0" "52_0" "81_0" "58_0" 


> head(y,20) 
       ID Age_Yrs_Sex 
1 10678800017  30_0 
2 106788000024  63_0 
4 10678800048  59_0 
5 1067880000055  68_1 
7 1067800079  59_0 
8 10678800086  36_1 
10 10678000109  39_0 
12 106788_0 
13 10678800130  45_1 
14 106788000147  49_1 
15 1067880000154  24_0 
16 106780000161  44_0 
17 1067880000178  43_1 
19 106780000192  79_0 
20 106880000208  22_0 
22 107880000222  89_0 
23 167880000239  28_0 
24 106788000246  44_1 
25 106780000253  76_0 
26 106780000260  45_1 
+0

は 'Age_Yrs_Sex'所与、y''から選択する行のロジックは何ですか? –

+0

yから無作為に選びたい – user2300940

+2

表示されている例に基づいて期待される出力はどれですか – akrun

答えて

1

xのエントリが常に所定の一致のためにyに比べて小さいと仮定すると、これは(dplyrを使用して)動作しなければなりません。ここで使用可能なサンプルデータを生成:

y <- 
    data.frame(
    ID = 1:1000 
    , Age_Yrs_Sex = paste(sample(1:10, 1000, TRUE) 
         , 0:1 
         , sep = "_") 
) 

x <- 
    data.frame(
    Age_Yrs_Sex = paste(c(1,1:4), 0, sep = "_") 
) 

は、それぞれから選択し、ちょうど試合にテーブルをフィルタリング

matches <- 
    table(x$Age_Yrs_Sex) 

(それは常に1である場合は省略可能)各事のための一致の数を数えます上記の表にある一致数をグループ化します(sliceを使用し、1から行数までランダムに行番号をサンプリングし、その一致の結果を表から戻します)。

y %>% 
    filter(Age_Yrs_Sex %in% names(matches)) %>% 
    group_by(Age_Yrs_Sex) %>% 
    slice(sample(1:n(), matches[as.character(Age_Yrs_Sex[1])])) 

は、(例えば)与える:

 ID Age_Yrs_Sex 
    <int>  <fctr> 
1 95   1_0 
2 777   1_0 
3 151   2_0 
4 951   3_0 
5 403   4_0 
+0

メモ:7月から回答を受け入れていない人を助けることに興奮するのはちょっと難しいです。 –

関連する問題