[英]Extracting a random sample of rows in a data.frame with a nested conditional
這個問題來自這里發現的SO帖子,並使用從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字段。 例如,如上所示如何采取隨機樣本,但僅限於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>
謝謝
我會使用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
使用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
不在一條線上做得更干凈,但是
iris[iris$Species != "setosa",][sample(nrow(iris[iris$Species != "setosa",]), 2), ]
干凈簡單的數據表方法:
require(data.table)
iris <- data.table(iris)
cond <- iris[Species!= 'setosa', which = T]
iris[sample(cond, 2)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.