Использование цикла с sample () на основе условий в фрейме данных - PullRequest
0 голосов
/ 11 января 2019

У меня есть набор данных с датами, сгенерированными из этого кода:

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 () для случайного выбора 3 дней из каждой недели без замены, но я не могу найти способ указать в моем цикле, что мне нужно делать выборку 3 раза для каждого целое число в date_df $ week, затем перейдите к следующей неделе.

Я не могу просто сделать выборку по заданной последовательности (например, 7 дней), потому что в реальном календаре несколько месяцев заканчиваются в середине недели.

Есть ли способ использовать sample (), условно основанный на других значениях в кадре данных?

1 Ответ

0 голосов
/ 11 января 2019

Мы можем использовать sample_n и group_by из пакета 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
# ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...