r语言 - 将日期序列传递到数据帧列



我正在尝试将一系列日期传递给数据帧:

DF_1 <- as.data.frame(matrix(ncol=2))            
days <-seq(as.Date("2016-01-01"), as.Date(Sys.time(),"%Y-%m-%d"), by="days")

for (i in 1:length(days)) {
print(days[i])
DF_1[i,1] <- days[i]
}

打印功能的结果为:

[1] "2021-06-23"
[1] "2021-06-24"
[1] "2021-06-25"
[1] "2021-06-26"
[1] "2021-06-27"
[1] "2021-06-28

" 但是 DF1 中的第 1 列是:

16801
16802
16803
16804
16805

为什么数据框中的日期分隔位会发生变化?

最好将"DF"初始化为

DF_1 <- data.frame(days)
str(DF_1)
'data.frame':   2006 obs. of  1 variable:
$ days: Date, format: "2016-01-01" "2016-01-02" "2016-01-03" "2016-01-04" ...

或者如果我们仍然想使用for循环,请使用Date类而不是logical初始化(matrix创建逻辑NA行)

DF_1 <- data.frame(col1 = as.Date(rep(NA, length(days))))

现在,如果我们做循环

for (i in 1:length(days)) {
print(days[i])
DF_1[i,1] <- days[i]
}

检查类

str(DF_1)
'data.frame':   2006 obs. of  1 variable:
$ col1: Date, format: "2016-01-01" "2016-01-02" "2016-01-03" "2016-01-04" ...

问题是强制Date到其整数存储值。 我们也可以在unlist时找到行为

unlist(as.list(head(days)))
[1] 16801 16802 16803 16804 16805 16806

或与unclass

unclass(head(days))
[1] 16801 16802 16803 16804 16805 16806

如果输入是list,则可以使用do.call中的c进行更正

do.call(c, as.list(head(days)))
[1] "2016-01-01" "2016-01-02" "2016-01-03" "2016-01-04" "2016-01-05" "2016-01-06"

或者之后通过在as.Date中指定origin将整数转换回Date

as.Date(unlist(as.list(head(days))), origin = '1970-01-01')
[1] "2016-01-01" "2016-01-02" "2016-01-03" "2016-01-04" "2016-01-05" "2016-01-06"

您还可以使用dplyr将日期添加到初始化的数据框中。

library(dplyr)
# Set up your dataframe based on the length of days.
days <-seq(as.Date("2016-01-01"), as.Date(Sys.time(),"%Y-%m-%d"), by="days")
DF_1 <- as.data.frame(matrix(ncol=2, nrow = length(days)))
# Then, add the date data to the first column in the initialized dataframe.
DF_2 <- DF_1 %>%
dplyr::mutate(V1 = days)

另一种选择是使用purrr将日期数据转换为 tibble。如果需要,可以重命名列并创建第二列。

library(purrr)
library(dplyr)
df <- days %>% 
purrr::map_df(as_tibble) %>% 
dplyr::rename(date = 1) %>% 
dplyr::mutate(V2 = NA)

相关内容

  • 没有找到相关文章

最新更新