web-dev-qa-db-ja.com

ネストされた条件付きのdata.frame内の行のランダムなサンプルを抽出する

この質問はSO post here here から作成され、R-helpメーリングリストの投稿から変更されたコードを使用できます こちらをご覧ください)

データフレームの行のランダムサンプルを抽出しようとしていますが、条件付きです。次のようなR irisデータを使用します。

> head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa 

単純なランダムサンプルを取得するために、以下のコードは2行のサンプルを取得するために適切に機能します。

iris[sample(nrow(iris), 2), ]

しかし、種フィールドを調整する方法がわかりません。たとえば、上記のランダムサンプルを取得する方法は、Species != “setosa”の場合のみです。

iris$Speciesには3つのカテゴリがあります

> summary(iris$Species)
    setosa versicolor  virginica 
        50         50         50

条件文を正しくネストする方法がわかりません。私の以前の試みの1つは、明らかに間違った結果が含まれている下にあります…。

> iris[sample(nrow(iris)[iris$Species != "setosa"], 2), ]
     Sepal.Length Sepal.Width Petal.Length Petal.Width Species
NA             NA          NA           NA          NA    <NA>
NA.1           NA          NA           NA          NA    <NA>

ありがとう

12
B. Davis

whichを使用して行番号のベクトルを取得し、そこから条件を指定してsampleを取得できます。

iris[ sample( which( iris$Species != "setosa" ) , 2 ) , ]
#    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
#59           6.6         2.9          4.6         1.3 versicolor
#133          6.4         2.8          5.6         2.2  virginica
18
Simon O'Hanlon

Dplyrを使用:

library(dplyr)
set.seed(12)
filter(iris, Species != "setosa") %>% sample_n(., 2) 

出力:

   Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
7           6.3         3.3          4.7         1.6 versicolor
81          7.4         2.8          6.1         1.9  virginica
10
mpalanco

1行で実行しない方がきれいですが、

iris[iris$Species != "setosa",][sample(nrow(iris[iris$Species != "setosa",]), 2), ]
4
colcarroll

クリーンでシンプルなデータテーブルアプローチ:

require(data.table)
iris <- data.table(iris)
cond <- iris[Species!= 'setosa', which = T]
iris[sample(cond, 2)]
4
Andreas