разверните каждую уникальную комбинацию вектором дат - PullRequest
1 голос
/ 24 апреля 2020

У меня есть фрейм данных с уникальными комбинациями:

df <- data.frame(
    d = c("d1", "d2")
    , t = c("t1", "t2")
)

и вектором дат:

dates <- seq(as.Date("2016/5/1"), as.Date("2016/7/1"), "months")

Я хотел бы расширить каждую строку уникальных комбинаций, чтобы получить это :

df1 <- expand.grid(d = c("d1"), t = c("t1"), date = dates)
df2 <- expand.grid(d = c("d2"), t = c("t2"), date = dates)
want <- rbind(df1, df2)

нужны данные:

   d  t       date
1 d1 t1 2016-05-01
2 d1 t1 2016-06-01
3 d1 t1 2016-07-01
4 d2 t2 2016-05-01
5 d2 t2 2016-06-01
6 d2 t2 2016-07-01

Очевидно, этот код работает, но у меня есть еще много уникальных комбинаций. Я мог бы использовать al oop, но было бы предпочтительнее что-то похожее на expand.grid, которое в этом случае не работает:

combinations <- expand.grid(df, date = dates)

Есть ли простой способ получить "желание", не прибегая к oop? Спасибо.

Ответы [ 3 ]

2 голосов
/ 24 апреля 2020

Вы можете использовать tidyr::expand_grid():

library(tidyr)
expand_grid(df, dates)

# A tibble: 6 x 3
  d     t     dates     
  <fct> <fct> <date>    
1 d1    t1    2016-05-01
2 d1    t1    2016-06-01
3 d1    t1    2016-07-01
4 d2    t2    2016-05-01
5 d2    t2    2016-06-01
6 d2    t2    2016-07-01
1 голос
/ 24 апреля 2020

Мы можем использовать crossing от tidyr

tidyr::crossing(df, dates)

# A tibble: 6 x 3
#   d     t     dates     
#  <fct> <fct> <date>    
#1 d1    t1    2016-05-01
#2 d1    t1    2016-06-01
#3 d1    t1    2016-07-01
#4 d2    t2    2016-05-01
#5 d2    t2    2016-06-01
#6 d2    t2    2016-07-01
1 голос
/ 24 апреля 2020

Возможно, я неправильно понял ваше намерение, но в вашем примере merge выполняет свою работу:

merge(df, dates)
   d  t          y
1 d1 t1 2016-05-01
2 d2 t2 2016-05-01
3 d1 t1 2016-06-01
4 d2 t2 2016-06-01
5 d1 t1 2016-07-01
6 d2 t2 2016-07-01

Из do c:

Если одним или обоими by.x и by.y имеют длину 0 (нулевой вектор длины или NULL), результат r является декартовым произведением x и y, т. е. dim (r) = c (nrow (x) * nrow (y), ncol (x) + ncol (y)).

Строки не упорядочены (вы можете сделать это на втором шаге), но результат тот же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...