How can I add several NA's as rows to data frame?

Viewed 257

Let's take data frame following :

> df<-data.frame(1:3,4:6,7:9)
> df
  X1.3 X4.6 X7.9
1    1    4    7
2    2    5    8
3    3    6    9

I want to add four new rows at the very beggining of data frame containing NA's. So it's very easy to do it by using rbind(). Just by

df<-rbind(NA,df) 

But is there any way how can I do it by one time four times ? Or I have to use above command four times to get result below :

> df
  X1.3 X4.6 X7.9
1   NA   NA   NA
2   NA   NA   NA
3   NA   NA   NA
4   NA   NA   NA
5    1    4    7
6    2    5    8
7    3    6    9
5 Answers

You can use rep in row subsetting.

rbind(df[rep(NA, 4),], df)
#     X1.3 X4.6 X7.9
#NA     NA   NA   NA
#NA.1   NA   NA   NA
#NA.2   NA   NA   NA
#NA.3   NA   NA   NA
#1       1    4    7
#2       2    5    8
#3       3    6    9

Similar to GKi's solution but without rbind():

df[c(rep(NA, 4L), seq_len(nrow(df))), ]
#      X1.3 X4.6 X7.9
# NA     NA   NA   NA
# NA.1   NA   NA   NA
# NA.2   NA   NA   NA
# NA.3   NA   NA   NA
# 1       1    4    7
# 2       2    5    8
# 3       3    6    9

If you don't mind having NA rows at the bottom:

df[ nrow(df) + 1:4, ] <- NA
#   X1.3 X4.6 X7.9
# 1    1    4    7
# 2    2    5    8
# 3    3    6    9
# 4   NA   NA   NA
# 5   NA   NA   NA
# 6   NA   NA   NA
# 7   NA   NA   NA

Or, to fix the order of NAs, subset rows that do not exist, and re-order (but I don't like the rownames):

df <- df[ c(nrow(df) + 1:4, seq(nrow(df))), ]
df
#      X1.3 X4.6 X7.9
# NA     NA   NA   NA
# NA.1   NA   NA   NA
# NA.2   NA   NA   NA
# NA.3   NA   NA   NA
# 1       1    4    7
# 2       2    5    8
# 3       3    6    9

Maybe there's a function to that, but you can use a one-liner loop:

for(i in 1:4){df <- rbind(NA,df)}
> rbind(matrix(rep(NA, 9), ncol = 3, dimnames = list(1:3, names(df))), df)
   X1.3 X4.6 X7.9
1    NA   NA   NA
2    NA   NA   NA
3    NA   NA   NA
11    1    4    7
21    2    5    8
31    3    6    9

If you want to reset rownames:

df <- rbind(matrix(rep(NA, 9), ncol = 3, dimnames = list(1:3, names(df))), df)
row.names(df) <- NULL
df
  X1.3 X4.6 X7.9
1   NA   NA   NA
2   NA   NA   NA
3   NA   NA   NA
4    1    4    7
5    2    5    8
6    3    6    9
Related