2016-12-19 5 views
2

this post,に基づいて、行のサンプルを作成しようとしています。同じRアイリスデータの例を使用する。私は正確にそれぞれの種のための15行ランダムなサンプルをグループ別に選択し、追加の条件を付けてください。

Selec_ir<-iris[ with(iris, unlist(tapply(seq_len(nrow(iris)), 
          Species, FUN = sample, 15,replace=FALSE))), ] 

のサンプルを作成しました。しかし、今どのように新しい選択された行は、少なくとも最後に選択した1から20行の後でなければならないという条件に基づいてサンプルを作成するために?

+0

あなたの質問に従ってくださいするためにはるかに簡単で、ほとんど不明です;説明するために希望する出力の例を提供してください。 – nrussell

+0

アイリスに150行しかない場合、前のサンプルの後に少なくとも20行ある15個のサンプルをどのように描画しますか? – manotheshark

+0

@manotheshark、申し訳ありませんが、ランダムに15行ではなく2行しか選択できません。 – freestyle

答えて

0

次の関数は、データセット内の各グループのすべてのrow_numbersを渡すために使用した後、交換することなくsampleを描画した後splitfindIntervalの組み合わせを使用してステップサイズ内に入る全ての値を削除します。返された配列は、所望のサンプルステップで所望のサンプルサイズからsliceまで使用される。

変更sample_sizesample_step保持サンプル

library(plyr) 

sample_drop <- function(x, sample_size, sample_step=1) { 

    # draw sample and convert to list 
    lst_samp <- list(sort(sample(x, size=sample_size, replace=FALSE))) 

    # function to split last element of list by step size 
    split_last <- function(lst, step) { 
    lst_tail <- unlist(tail(lst, n=1L)) 
    split(lst_tail, findInterval(lst_tail, c(0, step) + min(lst_tail))) 
    } 

    # split list until all values of last element fall within step size 
    while(do.call(function(x) max(x) - min(x), list(unlist(tail(lst_samp, n=1L)))) >= sample_step) { 
    lst_samp <- c(head(lst_samp, n=-1L), split_last(lst_samp, sample_step)) 
    } 

    #lst_samp <- llply(lst_samp, unname) # for debug only to remove attr names 
    laply(lst_samp, min) # return minimum value from each element 

} 

間の行のintialサンプルサイズと数を調整するために、必要に応じてここirisデータセットに適用される関数です。ここで

library(dplyr) 

data("iris") 

sample <- list() 
sample$seed <- 1 
sample$size <- 15L 
sample$step <- 20L 

# simulate sample draws with dropping and compare to iris results 
set.seed(sample$seed) 
sample_drop(50, sample$size, sample$step) 
sample_drop(50, sample$size, sample$step) 
sample_drop(50, sample$size, sample$step) 

set.seed(sample$seed) 
iris %>% 
    group_by(Species) %>% 
    mutate(gid=row_number()) %>% 
    slice(sample_drop(n(), sample$size, sample$step)) 

が大きく diamondsデータセット

library(dplyr) 
library(ggplot2) 

data("diamonds") 

sample <- list() 
sample$seed <- 1 
sample$size <- 1000L 
sample$step <- 20L 

set.seed(sample$seed) 
diamonds %>% 
    group_by(cut) %>% 
    mutate(gid=row_number()) %>% 
    slice(sample_drop(n(), sample$size, sample$step)) 

set.seed(sample$seed) 
diamonds %>% 
    group_by(cut) %>% 
    mutate(gid=row_number()) %>% 
    slice(sample_drop(n(), sample$size, sample$step)) %>% 
    summarise(samples=n()) 

改善の可能性の余地があるに適用される機能ですが、これは私が

+0

これはまさに私が探しているものですが、私は初心者です。私はdplyrライブラリを使ったことがありません。 2つの異なるデータセットにどのように適応するか: - 各種に対して15行をランダムに選択する必要があります(この場合は、虹彩の場合は3つではなく7つの種があります)。 - 各種10種(13種) コードで、samp_sizeをsamp_stepに変更すると、次のエラーが表示されます。 'サンプルサイズ(7)が母集団サイズ(4)を超えています。 replace = TRUE? ' – freestyle

+0

@freestyleこのエラーは通常、' replace = FALSE'の間に 'sample'がデータの元の' length'をサンプリングするように指示していることを意味します。 'replace'が' TRUE'にセットされていれば、指定されたサンプル長を埋めるためにデータから再描画できます。あなたのコメントには、それぞれのSpeciesに10行があると書かれていますが、十分な行があることと、 'group_by'コマンドが正しく設定されていることを確認するのが最初です。 – manotheshark

+0

@freestyleグループごとの行数を確認するには、次のコマンドを試してください。 'iris%>%group_by(種)%>%summarize(n())' – manotheshark

関連する問題