如何将日期向量拆分为k列?

时间:2019-03-27 12:27:44

标签: r date matrix vector

我有一个带有日期的向量,例如

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参数,在data.frame()内部使用matrix()函数会导致上述问题。对于这个看似简单的问题,我找不到任何解决方案,我很乐意提供帮助。

4 个答案:

答案 0 :(得分:3)

日期在内部存储为数字,因此您可以按所需格式将它们转换回去。

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 :(得分:2)

您可以拆分为列表并将其转换为data.frame

k <- 2
df <- as.data.frame(split(vec, f = as.factor(rep(1:k, each = length(vec)/k))))

答案 2 :(得分:1)

如果只有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

答案 3 :(得分:0)

您可以计算中间是什么,然后创建两个日期序列。

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') )