Как разбить вектор даты на k столбцов? - PullRequest
3 голосов
/ 27 марта 2019

У меня есть вектор с датами, например,

library("lubridate")
vec <- seq(ymd('1990-01-01'),ymd('1993-01-01'), by = '1 year')

который я хочу разделить на k столбцов. Предполагая, что k = 2, результирующий кадр данных должен выглядеть следующим образом:

          X1         X2
1 1990-01-01 1992-01-01
2 1991-01-01 1993-01-01

Первой идеей может быть что-то вроде этого:

m <- matrix(vec, ncol= 2)

Я уверен в том, что этот подход недопустим, поскольку matrix () убивает класс дат:

m
     [,1] [,2]
[1,] 7305 8035
[2,] 7670 8401

К сожалению, data.frame () не имеет аргумента ncol, и использование функции matrix () внутри data.frame () приводит к проблеме, показанной выше. Я не мог найти решение этого, казалось бы, простого вопроса, и я был бы рад помочь.

Ответы [ 4 ]

2 голосов
/ 27 марта 2019

Даты внутренне хранятся в виде чисел, поэтому вы можете преобразовать их обратно после получения в нужном формате.

k <- 2
df <- data.frame(matrix(vec, ncol = k))
df[] <- lapply(df, as.Date, origin = "1970-01-01")

df
#          X1         X2
#1 1990-01-01 1992-01-01
#2 1991-01-01 1993-01-01
1 голос
/ 27 марта 2019

Если это всего 4 элемента, тогда выполните

library(tibble)
tibble(X1 = vec[1:2], X2 = vec[3:4])
# A tibble: 2 x 2
#  X1         X2        
#   <date>     <date>    
#1 1990-01-01 1992-01-01
#2 1991-01-01 1993-01-01

Как правило,

library(dplyr)
library(tidyr)
k <- 2
tibble(X1 = vec) %>%
   group_by(grp = paste0("X", as.integer(gl(n(), k, n())))) %>%
   mutate(ind = row_number()) %>%  
   spread(grp, X1) %>%        
   select(-ind)
# A tibble: 2 x 2
#  X1         X2        
#  <date>     <date>    
#1 1990-01-01 1992-01-01
#2 1991-01-01 1993-01-01
1 голос
/ 27 марта 2019

Вы можете разбить на список и преобразовать это в data.frame:

k <- 2
df <- as.data.frame(split(vec, f = as.factor(rep(1:k, each = length(vec)/k))))
0 голосов
/ 27 марта 2019

Вы можете вычислить, что такое середина, а затем создать две последовательности дат.

library("lubridate")

StartDate <- ymd('1990-01-01')
EndDate <- ymd('1993-01-01')
MidDate <- StartDate + years(length(seq(StartDate,EndDate, by = '1 year'))/2)
data.frame(X1 = seq(StartDate, MidDate - years(1), by = '1 year'),
           X2 = seq(MidDate, EndDate, by = '1 year') )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...