使用嵌套条件提取data.frame中的行的随机样本

时间:2013-11-14 22:03:34

标签: r random

此问题来自SO帖found here,并使用从R-help邮件列表中的帖子修改的代码seen here

我试图在数据框中提取行的随机样本,但是使用条件。使用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字段。例如,如何如上所述采取随机样本,但仅限于Species != “setosa”

iris$Species

分为三类
> summary(iris$Species)
    setosa versicolor  virginica 
        50         50         50

我不确定如何正确嵌套条件。我之前的尝试之一是下面显而易见的错误结果......

> 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>

由于

4 个答案:

答案 0 :(得分:18)

我会使用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

答案 1 :(得分:10)

使用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

答案 2 :(得分:4)

不在一行中做得更清楚,但是

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

答案 3 :(得分:4)

干净简单的数据表方法:

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