user1997414
user1997414

Reputation: 189

create a data frame of dates

I have a vector of dates:

dates <- seq(as.Date('2017-01-01'), as.Date('2017-12-31'), by = 'days')

I want to create a data frame where this vector is repeated for n rows. Can anyone tell me how I might be able to accomplish this? Any help is greatly appreciated.

Thanks for the suggestions so far. Unfortunately, I think my intention was unclear in my original question. I would like each of n rows in the data frame to contain the vector of dates so that the final data frame would look something like this:

1  2017-01-01   2017-01-02.....2017-12-31
2  2017-01-01   2017-01-02.....2017-12-31
3  2017-01-01   2017-01-02.....2017-12-31
.
.
.    
n  2017-01-01   2017-01-02.....2017-12-31

Upvotes: 2

Views: 8400

Answers (3)

akrun
akrun

Reputation: 887851

We use replicate to do this

n <- 5
out <- do.call(rbind, replicate(n, as.data.frame(as.list(dates)),
             simplify = FALSE)) 
names(out) <- paste0('V', seq_along(out))
dim(out)
#[1]   5 365

out[1:3, 1:3]
#        V1         V2         V3
#1 2017-01-01 2017-01-02 2017-01-03
#2 2017-01-01 2017-01-02 2017-01-03
#3 2017-01-01 2017-01-02 2017-01-03

out[1:3, 362:365]
#        V362       V363       V364       V365
#1 2017-12-28 2017-12-29 2017-12-30 2017-12-31
#2 2017-12-28 2017-12-29 2017-12-30 2017-12-31
#3 2017-12-28 2017-12-29 2017-12-30 2017-12-31

Upvotes: 0

AkselA
AkselA

Reputation: 8846

As the question asker is hoping to fill n rows, wouldn't it make more sense to specify length.out rather than times?

set.seed(1)

dtf <- data.frame(A=letters[sample(1:27, 1000, TRUE)])

dtf$B <- rep(dates, length.out=nrow(dtf))

tail(dtf)
#      A          B
# 995  d 2017-09-22
# 996  u 2017-09-23
# 997  r 2017-09-24
# 998  h 2017-09-25
# 999  f 2017-09-26
# 1000 h 2017-09-27

Upvotes: 0

Conor Neilson
Conor Neilson

Reputation: 1091

You can use rep to repeat the vector and then coerce to a dataframe. For example, repeating 10 times

num_repeat <- 10

dates <- data.frame(rep(
  seq(as.Date('2017-01-01'), as.Date('2017-12-31'), by = 'days'), 
  times = num_repeat))

Upvotes: 4

Related Questions