Skip to content

index after rbind

5 messages · Ann Hess, Spencer Graves, Roger D. Peng +2 more

#
I am using rbind to concatenate two dataframes, but after the rbind I get
a strange "double" index.

I am using rbind a number of times to make one large dataset.  Is there a
way to prevent the "double" index?  Or is there some other way to
concatenate the data (it looks like merge only works by columns)?

Here is an example of the "double" index.
letters numbers
1        a       1
2        b       2
3        c       3
4        d       4
5        e       5
11       a       1
22       b       2
33       c       3
44       d       4
55       e       5
#
> df2 <- rbind(df1, df1)
 > df2
    a
1  1
2  2
11 1
22 2
 > rownames(df2) <- 1:4

hope this helps. spencer graves
Ann Hess wrote:
#
When you rbind() `data' and `data', the two dataframes have the exact same
rownames so rbind() tries to modify them to make the combined dataframe
have unique rownames.  If you don't want this, just use rownames()<- to
modify the row names.  Such as,

rownames(doubledata) <- 1:nrow(doubledata)

-roger
_______________________________
UCLA Department of Statistics
http://www.stat.ucla.edu/~rpeng
On Mon, 21 Apr 2003, Ann Hess wrote:

            
#
Dear Ann,

To elaborate Spencer's answer slightly, R requires that the row names of a 
data frame be unique. That's why it generated different row names for the 
rows of the two data frames given as arguments to rbind.

Again, the question is what you want to do here. You could generate more 
meaningful row names (e.g., "A1" - "A5", "B1" - "B5" for your original 
example) if this seems appropriate, but they have to be unique.

John
At 09:34 AM 4/21/2003 -0700, Spencer Graves wrote:
____________________________
John Fox
Department of Sociology
McMaster University
email: jfox at mcmaster.ca
web: http://www.socsci.mcmaster.ca/jfox
#
Spencer Graves <spencer.graves at pdf.com> writes:
...and this is not a bug. Data frames should have unique rownames, so
rbind.data.frame does this internally:

    while (any(xj <- duplicated(rlabs))) rlabs[xj] <- paste(rlabs[xj],
        1:sum(xj), sep = "")

[Just for fun, have a look at 
  df1 <- data.frame(a=1:2)
  df2 <- rbind(df1, df1, df1)
  rbind(df2,df2)
]

However, it might be considered slightly unfortunate that there is no
way to turn this off, even when the next thing you're going to do is to
set new rownames.