Подтвердить что ты не робот

Самый простой способ заставить rbind игнорировать имена столбцов

Это появилось только в ответе на другой вопрос. Когда вы 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).

4b9b3361

Ответ 1

Здесь вы можете найти setNames здесь...

rbind(df, setNames(rev(df), names(df)))
#  x y
#1 1 3
#2 2 4
#3 3 1
#4 4 2

Я подозреваю, что ваш реальный прецедент несколько сложнее. Вы можете, конечно, переупорядочить столбцы в первом аргументе setNames по своему усмотрению, просто используйте names(df) во втором аргументе, чтобы имена переупорядоченных столбцов соответствовали оригиналу.

Ответ 2

Это выглядит довольно легко:

mapply(c,df,df[,2:1])
     x y
[1,] 1 3
[2,] 2 4
[3,] 3 1
[4,] 4 2

В этом простом случае вам нужно вернуть его обратно в фреймворк (потому что mapply упрощает его до матрицы):

as.data.frame(mapply(c,df,df[,2:1]))
  x y
1 1 3
2 2 4
3 3 1
4 4 2

Важное примечание 1: Похоже, что обратное отношение типа применяется, когда ваш фреймворк содержит векторы разных типов:

df<-data.frame(x=1:2,y=3:4,z=c('a','b'))
mapply(c,df,df[,c(2:1,3)])
     x y z
[1,] 1 3 2
[2,] 2 4 1
[3,] 3 1 2
[4,] 4 2 1

Важное примечание 2: Это также ужасно, если у вас есть факторы.

df<-data.frame(x=factor(1:2),y=factor(3:4))
mapply(c,df[,1:2],df[,2:1])
     x y
[1,] 1 1
[2,] 2 2
[3,] 1 1
[4,] 2 2

Итак, до тех пор, пока у вас есть все числовые данные, все в порядке.