Это возникло как раз в ответ на другой вопрос. Когда вы 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)
.
rbind
на фреймах данных позаботился о сопоставлении именованных подмножеств (то есть столбцов). Если вы не хотите отслеживать объекты по имени, используйте в первую очередьmatrix
? - person Carl Witthoft   schedule 10.10.2013matrix
состоит в том, что он не позволяет смешивать типы. - person mrip   schedule 10.10.2013