【问题标题】:Extracting a random sample of rows in a data.frame with a nested conditional使用嵌套条件提取 data.frame 中的随机行样本
【发布时间】:2013-11-28 03:41:58
【问题描述】:

这个问题建立在 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>

谢谢

【问题讨论】:

  • iris[ sample( which( iris$Species != "setosa" ) , 2 ) , ]
  • @SimonO101 作为答案发布。

标签: r random


【解决方案1】:

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

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

    【讨论】:

    • 光滑。谢谢,我经常忘记 which()。
    • @simon-ohanlon 我如何应用这个条件:随机抽样替换,但概率应该是 80% 杂色和 20% 维吉尼亚
    • 如何在特定条件下制作一个带有 n 个随机行的火车组。例如,10 个满足 iris$Species == "setosa" 的随机行,10 个满足 iris$Species == "versicolor" 的随机行和 10 个满足 iris$Species == "virginica" 的随机行?
    • @MehdiAbbassi 这里:stackoverflow.com/a/23193184/1478381iris %&gt;% group_by(Species) %&gt;% do(sample_n(.,10))
    【解决方案3】:

    干净简单的数据表方法:

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

    【讨论】:

      【解决方案4】:

      不要一行做会更干净,但是

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-27
        • 1970-01-01
        • 2021-02-01
        • 1970-01-01
        • 2021-12-15
        • 2022-08-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多