我有一个带有日期的向量,例如
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()函数会导致上述问题。对于这个看似简单的问题,我找不到任何解决方案,我很乐意提供帮助。
答案 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') )