根据数据帧中的条件使用带有 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
# ...