# Append value to empty vector in R?

###### Posted By: Anonymous

I’m trying to learn R and I can’t figure out how to append to a list.

If this were Python I would . . .

```
#Python
vector = []
values = ['a','b','c','d','e','f','g']
for i in range(0,len(values)):
vector.append(values[i])
```

How do you do this in R?

```
#R Programming
> vector = c()
> values = c('a','b','c','d','e','f','g')
> for (i in 1:length(values))
+ #append value[i] to empty vector
```

## Solution

Appending to an object in a for loop causes the entire object to be copied on every iteration, which causes a lot of people to say “R is slow”, or “R loops should be avoided”.

As BrodieG mentioned in the comments: it is much better to pre-allocate a vector of the desired length, then set the element values in the loop.

Here are several ways to append values to a vector. All of them are discouraged.

### Appending to a vector in a loop

```
# one way
for (i in 1:length(values))
vector[i] <- values[i]
# another way
for (i in 1:length(values))
vector <- c(vector, values[i])
# yet another way?!?
for (v in values)
vector <- c(vector, v)
# ... more ways
```

`help("append")`

would have answered your question and saved the time it took you to write this question (but would have caused you to develop bad habits). 😉

Note that `vector <- c()`

isn’t an empty vector; it’s `NULL`

. If you want an empty character vector, use `vector <- character()`

.

### Pre-allocate the vector before looping

If you *absolutely must* use a for loop, you should pre-allocate the entire vector before the loop. This will be much faster than appending for larger vectors.

```
set.seed(21)
values <- sample(letters, 1e4, TRUE)
vector <- character(0)
# slow
system.time( for (i in 1:length(values)) vector[i] <- values[i] )
# user system elapsed
# 0.340 0.000 0.343
vector <- character(length(values))
# fast(er)
system.time( for (i in 1:length(values)) vector[i] <- values[i] )
# user system elapsed
# 0.024 0.000 0.023
```

###### Answered By: Anonymous

Disclaimer: This content is shared under creative common license cc-by-sa 3.0. It is generated from StackExchange Website Network.