ecerulm ecerulm - 1 year ago 91
R Question

How can I pad a vector with NA from the front?

I want to make an existing vector size

and use
. I know I can pad at the end of the vector like so:

v1 <- 1:10
v2 <- diff(v1)
length(v2) <- length(v1)
# 1 1 1 1 1 1 1 1 1 NA

But I want to fill the
at the beginnning instead in a generic way. I mean for this particular example I can just

v2 <- c(NA, diff(v1))
# NA 1 1 1 1 1 1 1 1 1

But I was hoping that there exist some base R function or library that provides something like
v2 <- pad(v2, n=length(v1), value=NA)

Is there anything like that I can use off the self or do I need to define my own function:

pad <- function(x, n) { # ugly function that doesn't keep the attributes of x
len.diff <- n - length(x)
c(rep(NA, len.diff), x)

pad(1:10, 12) # NA NA 1 2 3 4 5 6 7 8 9 10

Answer Source

Assuming v1 has the desired length and v2 is shorter (or the same length) these left pad v2 with NA values to the length of v1. The first four assume numeric vectors although they can be modified to also work more generally by replacing NA*v1 in the code with rep(NA, length(v1)).

replace(NA * v1, seq(to = length(v1), length = length(v2)), v2)

rev(replace(NA * v1, seq_along(v2), rev(v2)))

replace(NA * v1, seq_along(v2) + length(v1) - length(v2), v2)

tail(c(NA * v1, v2), length(v1))

c(rep(NA, length(v1) - length(v2)), v2)

The fourth is the shortest. The first two and fourth do not involve any explicit arithmetic calculations other than multiplying v1 with NA values. The second is likely slow since it involves two applications of rev.

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download