我正在尝试将一系列日期传递给数据帧:
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)