Дублирование строк и перемаркировка двух столбцов в R - PullRequest
0 голосов
/ 19 марта 2020

У меня есть фрейм данных со следующими переменными, датой, часом, местоположением.

date=c("30/03/2018","30/03/2018","30/03/2018","30/03/2018","30/03/2018","30/03/2018","30/03/2018")
hour=c(1,1,1,1,1,1,1)
location=c(China,India,France,Japan,Korea,Congo,USA)
df <- data.frame(date, hour, location)

Мне нужно будет продублировать этот набор данных много раз, так что я получу те же 6 местоположений от часа 1 до часа 24 и с даты 30/03/2018 до конца 2018 года (т. е. 31/12/2018). Это означает, что на каждой дате у меня будет 1 час до 24 часов. И каждый час у меня будет ровно 6 одинаковых мест.

Есть ли способ упростить процесс кодирования? Я пытался использовать rep для дублирования набора данных, но у меня возникают проблемы с маркировкой.

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Вы, вероятно, ищете expand.grid().

dat <- expand.grid(date=seq.Date(as.Date("2018-03-30"), as.Date("2018-12-31"), by="day"),
                  location=c("China","India","France","Japan","Korea","Congo","USA"),
                  hour=1:24)

Результат

str(dat)
# 'data.frame': 46536 obs. of  3 variables:
#   $ date    : Date, format: "2018-03-30" "2018-03-31" ...
# $ location: Factor w/ 7 levels "China","India",..: 1 1 1 1 1 1 1 1 1 1 ...
# $ hour    : int  1 1 1 1 1 1 1 1 1 1 ...
# - attr(*, "out.attrs")=List of 2
# ..$ dim     : Named int  277 7 24
# .. ..- attr(*, "names")= chr  "date" "location" "hour"
# ..$ dimnames:List of 3
# .. ..$ date    : chr  "date=2018-03-30" "date=2018-03-31" "date=2018-04-01" "date=2018-04-02" ...
# .. ..$ location: chr  "location=China" "location=India" "location=France" "location=Japan" ...
# .. ..$ hour    : chr  "hour= 1" "hour= 2" "hour= 3" "hour= 4" ..
2 голосов
/ 19 марта 2020

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

library(dplyr)
library(tidyr)

df %>%
  mutate(date = as.Date(date, "%d/%m/%Y")) %>%
  complete(location,date = seq(min(date),as.Date('2018-12-31'),by = "day"), 
                   hour = 1:24)


# A tibble: 46,536 x 3
#   location date        hour
#   <fct>    <date>     <dbl>
# 1 China    2018-03-30     1
# 2 China    2018-03-30     2
# 3 China    2018-03-30     3
# 4 China    2018-03-30     4
# 5 China    2018-03-30     5
# 6 China    2018-03-30     6
# 7 China    2018-03-30     7
# 8 China    2018-03-30     8
# 9 China    2018-03-30     9
#10 China    2018-03-30    10
# … with 46,526 more rows
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...