R语言 如何乘行,使我得到一个特定的工作日的前4周和以下4周

nhn9ugyo  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(63)

我有数据,包括日期和星期几。
我想确定在原始数据中紧接在日期之前的特定工作日的4个示例,以及在原始数据中紧接在日期之后的同一工作日的4个示例。例如,如果第一个记录的日期为“2010-05-03”,这是一个星期二,我想将2010年4月的4个星期二和2010年5月的4个星期二行绑定到原始数据集。我想对原始数据中的每条记录执行此操作,并获得包含所有原始记录的单个数据集,添加了日期的记录。
在添加这些新行时,我还想用原始数据中的所有列的值填充这些新行,除了一个列。例外是一个名为“event”的变量,它指示该行是否在原始数据集中。
最后,我想从每个原始记录中添加到原始数据的8行中随机选择4行,这样最终的数据集每个原始记录有5行(1行包含原始日期,4行包含添加和随机选择的日期)。
预期输出

> head(dt1[, 1:7])
   id duplicate_ data di na      dow year month date_of_on
1:  1       <NA>       <NA>  Tuesday 2011     5 2011-05-03
2:  2       <NA>       <NA> Saturday 2011    12 2011-12-10

> head(dt3[1:10, 1:7])
         date year month day      dow id date_of_onset    event

1: 2011-04-05 2011     4   5  Tuesday  1    2011-05-03.      0
2: 2011-04-12 2011     4  12  Tuesday  1    2011-05-03       0
3: 2011-04-19 2011     4  19  Tuesday  1    2011-05-03       0
4: 2011-04-26 2011     4  26  Tuesday  1    2011-05-03       0
5: 2011-05-03 2011     5   3  Tuesday  1    2011-05-03       1
6: 2011-05-10 2011     5  10  Tuesday  1    2011-05-03       0
7: 2011-05-17 2011     5  17  Tuesday  1    2011-05-03       0
8: 2011-05-24 2011     5  24  Tuesday  1    2011-05-03       0
9: 2011-05-31 2011     5  31  Tuesday  1    2011-05-03       0

字符串
在从添加的8行中随机选择4行后,它应该如下所示

> head(dt4[1:10, 1:7])
         date year month day      dow id date_of_onset    event
1: 2011-04-05 2011     4   5  Tuesday  1    2011-05-03.      0
2: 2011-04-19 2011     4  19  Tuesday  1    2011-05-03       0
3: 2011-05-03 2011     5   3  Tuesday  1    2011-05-03       1
4: 2011-05-10 2011     5  10  Tuesday  1    2011-05-03       0
5: 2011-05-24 2011     5  24  Tuesday  1    2011-05-03       0


我发现下面的帖子部分有用,但不能完全满足我的查询:How to row bind all cases of a particular weekday in a given year-month into an R dataset

sulc1iza

sulc1iza1#

如果我理解正确的话,你可以尝试以下方法。
使用pmap_dfr遍历data.frame的每一行。在这种情况下,您可以通过该函数传递所有列数据...
sample_dates将从包含事件前4周和事件后4周的日期向量中采样。
结果将被放置到一个临时 Dataframe 中,event为0,并与原始数据(event为1)合并。

df <- data.frame(
  id = c(1, 2),
  dow = c("Tuesday", "Saturday"),
  date_of_onset = as.Date(c("2011-05-03", "2011-12-10"))
)

library(tidyverse)
library(lubridate)

set.seed(123)

df %>%
  pmap_dfr(function(...) {
    x <- tibble(...)
    sample_dates <- sample(c(seq.Date(x$date_of_onset - weeks(4), by = "week", length.out = 4),
                             seq.Date(x$date_of_onset + weeks(1), by = "week", length.out = 4)), 4)
    return(bind_rows(mutate(x, event = 1),
                     left_join(tibble(id = x$id, date_of_onset = sample_dates, event = 0), 
                               select(x, -date_of_onset), 
                               by = "id")
    ))
  }) %>%
  arrange(id, date_of_onset)

字符串

输出

id dow      date_of_onset event
   <dbl> <chr>    <date>        <dbl>
 1     1 Tuesday  2011-04-19        0
 2     1 Tuesday  2011-05-03        1
 3     1 Tuesday  2011-05-17        0
 4     1 Tuesday  2011-05-24        0
 5     1 Tuesday  2011-05-31        0
 6     2 Saturday 2011-11-19        0
 7     2 Saturday 2011-11-26        0
 8     2 Saturday 2011-12-10        1
 9     2 Saturday 2011-12-24        0
10     2 Saturday 2012-01-07        0

相关问题