根据数据帧中的条件使用带有 sample() 的循环
Using a loop with sample() based on conditions in dataframe
我有一个数据集,其中包含从此代码生成的日期:
library(chron)
dates <- seq.dates("1/1/2019", "1/6/2020", by = "days")
week <- c(1:53)
day <- c("tuesday", "wednesday", "thursday", "friday", "saturday", "sunday",
"monday")
weeks <- rep(1:53, each = 7)
dates_df <- data.frame(date=dates, day=day, week=weeks)
我正在尝试使用带有 sample() 的循环来随机 select 每周 3 天而不更换,但我似乎无法找到一种方法来在我的循环中表明我需要在 dates_df$ 周内对每个整数采样 3 次,然后移至下一周。
我不能简单地按设定的顺序(例如 7 天)进行抽样,因为在实际日历中,有些月会在一周的中间结束。
有没有一种方法可以根据数据框中的其他值有条件地使用 sample()?
我们可以使用sample_n
and group_by
from the dplyr
包:
library(dplyr)
dates_df %>%
group_by(week) %>%
sample_n(3)
# date day week
# <S3: dates> <fct> <int>
# 1 01/03/19 thursday 1
# 2 01/07/19 monday 1
# 3 01/04/19 friday 1
# 4 01/10/19 thursday 2
# 5 01/08/19 tuesday 2
# 6 01/13/19 sunday 2
# 7 01/16/19 wednesday 3
# 8 01/17/19 thursday 3
# 9 01/21/19 monday 3
# ....
对于每个星期,sample_n
函数会选择三个日期。 sample_n
的默认设置是采样而不放回。
这是一个基本的 R
解决方案,使用 by
:
do.call('rbind', # bind by row
by(dates_df, dates_df$week, # split data by week
FUN = function(d) d[sample(nrow(d), 3),])) # sample
# date day week
# 1.5 01/05/19 saturday 1
# 1.3 01/03/19 thursday 1
# 1.7 01/07/19 monday 1
# 2.13 01/13/19 sunday 2
# 2.9 01/09/19 wednesday 2
# 2.8 01/08/19 tuesday 2
# ...
我有一个数据集,其中包含从此代码生成的日期:
library(chron)
dates <- seq.dates("1/1/2019", "1/6/2020", by = "days")
week <- c(1:53)
day <- c("tuesday", "wednesday", "thursday", "friday", "saturday", "sunday",
"monday")
weeks <- rep(1:53, each = 7)
dates_df <- data.frame(date=dates, day=day, week=weeks)
我正在尝试使用带有 sample() 的循环来随机 select 每周 3 天而不更换,但我似乎无法找到一种方法来在我的循环中表明我需要在 dates_df$ 周内对每个整数采样 3 次,然后移至下一周。
我不能简单地按设定的顺序(例如 7 天)进行抽样,因为在实际日历中,有些月会在一周的中间结束。
有没有一种方法可以根据数据框中的其他值有条件地使用 sample()?
我们可以使用sample_n
and group_by
from the dplyr
包:
library(dplyr)
dates_df %>%
group_by(week) %>%
sample_n(3)
# date day week
# <S3: dates> <fct> <int>
# 1 01/03/19 thursday 1
# 2 01/07/19 monday 1
# 3 01/04/19 friday 1
# 4 01/10/19 thursday 2
# 5 01/08/19 tuesday 2
# 6 01/13/19 sunday 2
# 7 01/16/19 wednesday 3
# 8 01/17/19 thursday 3
# 9 01/21/19 monday 3
# ....
对于每个星期,sample_n
函数会选择三个日期。 sample_n
的默认设置是采样而不放回。
这是一个基本的 R
解决方案,使用 by
:
do.call('rbind', # bind by row
by(dates_df, dates_df$week, # split data by week
FUN = function(d) d[sample(nrow(d), 3),])) # sample
# date day week
# 1.5 01/05/19 saturday 1
# 1.3 01/03/19 thursday 1
# 1.7 01/07/19 monday 1
# 2.13 01/13/19 sunday 2
# 2.9 01/09/19 wednesday 2
# 2.8 01/08/19 tuesday 2
# ...