Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

R: control auto-created column names in call to rbind()

Tags:

r

If I do something like this:

> df <- data.frame()
> rbind(df, c("A","B","C"))
  X.A. X.B. X.C.
1    A    B    C

You can see the row gets added to the empty data frame. However, the columns get named automatically based on the content of the data.

This causes problems if I later want to:

> df <- rbind(df, c("P", "D", "Q"))

Is there a way to control the names of the columns that get automatically created by rbind? Or some other way to do what I'm attempting to do here?

like image 956
laslowh Avatar asked Dec 05 '25 02:12

laslowh


1 Answers

@baha-kev has a good answer regarding strings and factors.

I just want to point out the weird behavior of rbind for data.frame:

# This is "should work", but it doesn't:
# Create an empty data.frame with the correct names and types
df <- data.frame(A=numeric(), B=character(), C=character(), stringsAsFactors=FALSE)
rbind(df, list(42, 'foo', 'bar')) # Messes up names!
rbind(df, list(A=42, B='foo', C='bar')) # OK...

# If you have at least one row, names are kept...
df <- data.frame(A=0, B="", C="", stringsAsFactors=FALSE)
rbind(df, list(42, 'foo', 'bar')) # Names work now...

But if you only have strings then why not use a matrix instead? Then it works fine to start with an empty matrix:

# Create a 0x3 matrix:
m <- matrix('', 0, 3, dimnames=list(NULL, LETTERS[1:3]))

# Now add a row:
m <- rbind(m, c('foo','bar','baz')) # This works fine!
m

# Then optionally turn it into a data.frame at the end...
as.data.frame(m, stringsAsFactors=FALSE)
like image 74
Tommy Avatar answered Dec 07 '25 18:12

Tommy



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!