Это появилось только в ответе на другой вопрос. Когда вы rbind
два кадра данных, он сопоставляет столбцы по имени, а не по индексу, что может привести к неожиданному поведению:
> 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
Конечно, есть обходные пути. Например:
rbind(df,rename(df[,2:1],names(df)))
data.frame(rbind(as.matrix(df),as.matrix(df[,2:1])))
В редакторе: rename
из пакета plyr
на самом деле не работает таким образом (хотя я думал, что он работал, когда я изначально написал это...). Способ сделать это путем переименования - использовать решение SimonO101:
rbind(df,setNames(df[,2:1],names(df)))
Кроме того, возможно, удивительно,
data.frame(rbindlist(list(df,df[,2:1])))
работает по индексу (и если мы не против таблицы данных, тогда это довольно кратким), так что это разница между do.call(rbind)
.
Вопрос в том, что является самым кратким способом для rbind
двух фреймов данных, где имена не совпадают? Я знаю, что это кажется тривиальным, но это может привести к загромождению кода. И я не хочу писать новую функцию под названием rbindByIndex
. В идеале это было бы что-то вроде rbind(df,df[,2:1],byIndex=T)
.