Вместо того, чтобы приводить класс Date
к integer
и затем преобразовывать его, лучшим вариантом будет создать его как list
и использовать do.call
с c
yrmonday <- do.call(`c`, lapply(2000:2017,function(x)
seq(as.Date(paste0(as.character(x),'-01-01')),by='8 day',length=46)) )
str(yrmonday)
# Date[1:828], format: "2000-01-01" "2000-01-09" "2000-01-17" "2000-01-25" "2000-02-02" "2000-02-10" "2000-02-18" "2000-02-26" ...
dput(head(yrmonday))
structure(c(10957L, 10965L, 10973L, 10981L, 10989L, 10997L), class = "Date")
Используя вышеприведенное в качестве столбца в data.frame
df <- data.frame(date=yrmonday,fid=rep(1:46,time=18),
dayorder=rep(seq(1,365,8),time=18),
value=runif(length(yrmonday))
)
tail
и head
работает как положено
tail(df)
# date fid dayorder value
#823 2017-11-17 41 321 0.2477746
#824 2017-11-25 42 329 0.3980863
#825 2017-12-03 43 337 0.1112133
#826 2017-12-11 44 345 0.4216226
#827 2017-12-19 45 353 0.2391892
#828 2017-12-27 46 361 0.8505323
head(df)
# date fid dayorder value
#1 2000-01-01 1 1 0.3654198
#2 2000-01-09 2 9 0.4804265
#3 2000-01-17 3 17 0.6757607
#4 2000-01-25 4 25 0.7864473
#5 2000-02-02 5 33 0.8100581
#6 2000-02-10 6 41 0.0786775
Проблема, по-видимому, связана с изменением режима хранения с integer
на numeric
в sapply
для класса Date
(из 'yrmonday' ОП)
dput(head(yrmonday))
#structure(c(10957, 10965, 10973, 10981, 10989, 10997), class = "Date")
Аналогичный способ создания tbl_df
в tidyverse
будет
library(tidyverse)
map(2000:2017, ~
seq(as.Date(paste0(.x, '-01-01')), by = '8 day', length = 46)) %>%
reduce(c) %>%
data_frame(date = ., fid = rep(1:46, time = 18),
dayorder = rep(seq(1, 365, 8), time = 18), value = runif(length(.)))