158
  1. Create an empty data frame:
y <- data.frame()
  1. Assign x, a string vector, to y as its column names:
    x <- c("name", "age", "gender")
    colnames(y) <- x

Result:

Error in colnames<-(*tmp*, value = c("name", "age", "gender")) : 'names' attribute [3] must be the same length as the vector [0]

Actually, the x length is dynamic, so

y <- data.frame(name=character(), age=numeric(), gender=logical())

is not an efficient way to name the column. How can I solve the problem?

UseR10085
  • 7,120
  • 3
  • 24
  • 54
Eric Chang
  • 2,580
  • 4
  • 19
  • 19
  • 1
    If you want to create an empty data.frame with dynamic names (colnames in a variable), this can help: names <- c("v","u","w") df <- data.frame() for (k in names) df[[k]]<-as.numeric() You can change the type as well if you need so. – Ali Khosro Mar 03 '17 at 20:11

1 Answers1

391

How about:

df <- data.frame(matrix(ncol = 3, nrow = 0))
x <- c("name", "age", "gender")
colnames(df) <- x

To do all these operations in one-liner:

setNames(data.frame(matrix(ncol = 3, nrow = 0)), c("name", "age", "gender"))

#[1] name   age    gender
#<0 rows> (or 0-length row.names)

Or

data.frame(matrix(ncol=3,nrow=0, dimnames=list(NULL, c("name", "age", "gender"))))
Ronak Shah
  • 377,200
  • 20
  • 156
  • 213
  • hello, do you have an easy way to add columns (type = character) which colnames are ``` new_col_names <- c("new1", "new2") ``` ? I tried this : ``` df[, new_col_names ] <- NULL ``` , this doesn't work – DD chen Jun 04 '20 at 17:14
  • 4
    @DDchen If you have a dataframe `df`, this should work `df[new_col_names] <- NA_character_` – Ronak Shah Jun 05 '20 at 00:00