如何在 dplyr 中每 n 行非随机采样?
Posted
技术标签:
【中文标题】如何在 dplyr 中每 n 行非随机采样?【英文标题】:How to non-randomly sample every n rows in dplyr? 【发布时间】:2015-09-02 07:15:48 【问题描述】:我想在 dplyr 中做sample_n()
,除了我不希望抽样是随机的,我打算每 n 行抽样一次。
有没有办法做到这一点?
例如,我想在按Month
和Day
排序后获取airquality
数据集的每10 行。预期输出:
Ozone Solar.R Wind Temp Month Day
NA 194 8.6 69 5 10
11 44 9.7 62 5 20
115 223 5.7 79 5 30
71 291 13.8 90 6 9
12 120 11.5 73 6 19
NA 31 14.9 77 6 29
...
【问题讨论】:
【参考方案1】:您真的很想使用序列进行子集化。
mtcars[seq(1, nrow(mtcars), 10), ]
将mtcars
替换为您的data.frame,并将10
替换为您要提取的第n 行
【讨论】:
我在问是否有办法在 dplyr 中做到这一点。你不能在链的中间这样做(好吧,你可以用“。”破解它)一般来说这样做是微不足道的。【参考方案2】:如果您有想要采样的有序数据的数据框,您可以在row_number
上进行过滤:
library(tidyverse)
airquality %>%
arrange(Month, Day) %>%
filter(row_number() %% 10 == 0) %>%
head()
#> Ozone Solar.R Wind Temp Month Day
#> 1 NA 194 8.6 69 5 10
#> 2 11 44 9.7 62 5 20
#> 3 115 223 5.7 79 5 30
#> 4 71 291 13.8 90 6 9
#> 5 12 120 11.5 73 6 19
#> 6 NA 31 14.9 77 6 29
由于每个月没有分组,因此保留了每 10 行(这意味着 Day
从 10 秒变为 9 秒)。按Month
分组可以解决这个问题:
airquality %>%
arrange(Month, Day) %>%
group_by(Month) %>%
filter(row_number() %% 10 == 0) %>%
head()
#> # A tibble: 6 x 6
#> # Groups: Month [2]
#> Ozone Solar.R Wind Temp Month Day
#> <int> <int> <dbl> <int> <int> <int>
#> 1 NA 194 8.60 69 5 10
#> 2 11 44 9.70 62 5 20
#> 3 115 223 5.70 79 5 30
#> 4 39 323 11.5 87 6 10
#> 5 13 137 10.3 76 6 20
#> 6 NA 138 8.00 83 6 30
当然,我们本可以只使用filter(Day %% 10 == 0)
,但并不总是可以使用这么好的数字!
【讨论】:
【参考方案3】:如果您打算对 data.frame 中的每“n”行进行采样并在每个“n”中获取“n1”行,请为每“n”行创建一个分组变量并使用sample_n
。 (这是我的解释,欢迎指正)
library(dplyr)
n <- 6
n1 <- 3
df1 %>%
group_by(gr= as.numeric(gl(n(), n, n()))) %>%
sample_n(.,n1)
数据
set.seed(24)
df1 <- as.data.frame(cbind(rn=1:40, matrix(sample(0:10,3*40,
replace=TRUE), ncol=3)) )
【讨论】:
以上是关于如何在 dplyr 中每 n 行非随机采样?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?