我想在dplyr中进行sample_n()
,除非我不希望抽样是随机的,我打算每隔n行进行一次采样。
有办法做到这一点吗?
例如,我希望在按airquality
和Month
排序后获取Day
数据集的每第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
...
答案 0 :(得分:6)
您真的希望使用序列进行子集化。
mtcars[seq(1, nrow(mtcars), 10), ]
将mtcars
次出现替换为您的data.frame,并将10
替换为您想要提取的第n行
答案 1 :(得分:1)
如果您打算对每个&n;' n' data.frame中的行并获取' n1'每个' n'中的行,为每个' 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)) )
答案 2 :(得分:1)
如果您有想要抽样的有序数据的数据框,可以在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)
,但是并不总是有这么好的数字可供使用!