Большинство ответов base R относятся к ситуации, когда только один data.frame имеет дополнительные столбцы или что результирующий data.frame будет иметь пересечение столбцов.Поскольку OP пишет , я надеюсь сохранить столбцы, которые не совпадают после привязки , ответ с использованием базовых методов R для решения этой проблемы, вероятно, стоит опубликовать.
Ниже я представляюдва базовых метода R: один, который изменяет исходные данные. и другой.Кроме того, я предлагаю метод, который обобщает неразрушающий метод для более чем двух data.frames.
Во-первых, давайте получим несколько примеров данных.
# sample data, variable c is in df1, variable d is in df2
df1 = data.frame(a=1:5, b=6:10, d=month.name[1:5])
df2 = data.frame(a=6:10, b=16:20, c = letters[8:12])
Два data.frames, изменяющие оригиналы
Чтобы сохранить все столбцы из обоих data.frames в rbind
(и позволить функции работать без ошибок), вы добавляете столбцы NA к каждому данным.frame с соответствующими пропущенными именами, заполненными с помощью setdiff
.
# fill in non-overlapping columns with NAs
df1[setdiff(names(df2), names(df1))] <- NA
df2[setdiff(names(df1), names(df2))] <- NA
Now, rbind
-em
rbind(df1, df2)
a b d c
1 1 6 January <NA>
2 2 7 February <NA>
3 3 8 March <NA>
4 4 9 April <NA>
5 5 10 May <NA>
6 6 16 <NA> h
7 7 17 <NA> i
8 8 18 <NA> j
9 9 19 <NA> k
10 10 20 <NA> l
Обратите внимание, что первые две строки изменяют исходные данные.кадры, df1 и df2, добавляя к обоим полный набор столбцов.
Два data.frames, не изменяйте оригиналы
Чтобы оставить исходные data.frames без изменений, первый цикл по именам, которые отличаются, возвращает именованный вектор NA, которые объединяются в список с data.frame, используя c
.Затем data.frame
преобразует результат в соответствующий data.frame для rbind
.
rbind(
data.frame(c(df1, sapply(setdiff(names(df2), names(df1)), function(x) NA))),
data.frame(c(df2, sapply(setdiff(names(df1), names(df2)), function(x) NA)))
)
Многие data.frames, не изменяющие оригиналы
В случае, если у вас есть более двух data.frames, вы можете сделать следующее:
# put data.frames into list (dfs named df1, df2, df3, etc)
mydflist <- mget(ls(pattern="df\\d+")
# get all variable names
allNms <- unique(unlist(lapply(mydflist, names)))
# put em all together
do.call(rbind,
lapply(mydflist,
function(x) data.frame(c(x, sapply(setdiff(allNms, names(x)),
function(y) NA)))))
Может быть, немного лучше, чтобы не видеть имена строк оригинальных data.frames?Тогда сделай это.
do.call(rbind,
c(lapply(mydflist,
function(x) data.frame(c(x, sapply(setdiff(allNms, names(x)),
function(y) NA)))),
make.row.names=FALSE))