This came up just in an answer to another question here. When you rbind
two data frames, it matches columns by name rather than index, which can lead to unexpected behavior:
> df<-data.frame(x=1:2,y=3:4)
> df
x y
1 1 3
2 2 4
> rbind(df,df[,2:1])
x y
1 1 3
2 2 4
3 1 3
4 2 4
Of course, there are workarounds. For example:
rbind(df,rename(df[,2:1],names(df)))
data.frame(rbind(as.matrix(df),as.matrix(df[,2:1])))
On edit: rename
from the plyr
package doesn't actually work this way (although I thought I had it working when I originally wrote this...). The way to do this by renaming is to use SimonO101's solution:
rbind(df,setNames(df[,2:1],names(df)))
Also, maybe surprisingly,
data.frame(rbindlist(list(df,df[,2:1])))
works by index (and if we don't mind a data table, then it's pretty concise), so this is a difference between do.call(rbind)
.
The question is, what is the most concise way to rbind
two data frames where the names don't match? I know this seems trivial, but this kind of thing can end up cluttering code. And I don't want to have to write a new function called rbindByIndex
. Ideally it would be something like rbind(df,df[,2:1],byIndex=T)
.
rbind
on dataframes take the care to match named subsets (i.e. columns). When you don't want to "track" things by name, usematrix
in the first place? – Carl Witthoftmatrix
is because it doesn't allow mixing of types. – mrip