Можно ли связать строки двумя фреймами данных, которые не имеют одинаковый набор столбцов? Я надеюсь сохранить столбцы, которые не соответствуют после привязки.
232
rbind.fill
из пакета plyr
может быть то, что вы ищете.
rbind.fill
иbind_rows()
оба молча отбрасывают имена строк.Более свежее решение использовать
dplyr
«sbind_rows
функцию , которую я предполагаю , является более эффективным , чемsmartbind
.источник
ABC
невозможно преобразовать столбец из символьного в числовой. Есть ли способ сначала преобразовать столбцы?Вы можете использовать
smartbind
изgtools
пакета.Пример:
источник
smartbind
с двумя большими кадрами данных (в общей сложности примерно 3 * 10 ^ 6 строк) и прервал его через 10 минут.Если столбцы в df1 являются подмножеством столбцов в df2 (по именам столбцов):
источник
Альтернатива с
data.table
:rbind
также будет работатьdata.table
до тех пор, пока объекты преобразуются вdata.table
объекты, поэтомутакже будет работать в этой ситуации. Это может быть предпочтительнее, когда у вас есть пара data.tables и вы не хотите создавать список.
источник
intersect
подход, работают только для двух информационных фреймов и не легко обобщаются.Большинство базовых ответов R относятся к ситуации, когда только один data.frame имеет дополнительные столбцы или что результирующий data.frame будет иметь пересечение столбцов. Так как OP пишет, я надеюсь сохранить столбцы, которые не совпадают после привязки , ответ с использованием базовых методов R для решения этой проблемы, вероятно, стоит опубликовать.
Ниже я представляю два базовых метода R: один, который изменяет исходные данные. Frame, а другой - нет. Кроме того, я предлагаю метод, который обобщает неразрушающий метод для более чем двух data.frames.
Во-первых, давайте возьмем пример данных.
Два data.frames, изменение оригиналов.
Чтобы сохранить все столбцы из обоих data.frames в
rbind
(и позволить функции работать без ошибок), вы добавляете столбцы NA в каждый data.frame с заполнением соответствующих пропущенных имен. используяsetdiff
.Теперь,
rbind
-емОбратите внимание, что первые две строки изменяют исходные data.frames, df1 и df2, добавляя к обоим полный набор столбцов.
Два data.frames, не изменяющие оригиналы.
Чтобы оставить исходные data.frames нетронутыми, сначала выполните цикл по разным именам, верните именованный вектор NA, которые объединены в список с использованием data.frame
c
. Затемdata.frame
преобразует результат в соответствующий data.frame дляrbind
.Многие data.frames не меняют оригиналы.
В случае, если у вас есть более двух data.frames, вы можете сделать следующее.
Может быть, немного приятнее не видеть имена строк оригинальных data.frames? Тогда сделай это.
источник
mydflist <- list(as, dr, kr, hyt, ed1, of)
. Это должно создать объект списка, который не увеличивает размер вашей среды, а просто указывает на каждый элемент списка (до тех пор, пока вы не измените какое-либо содержимое впоследствии). После операции удалите объект списка, просто чтобы быть в безопасности.Вы также можете просто извлечь общие имена столбцов.
источник
Я написал функцию, чтобы сделать это, потому что мне нравится мой код, чтобы сказать мне, если что-то не так. Эта функция явно скажет вам, какие имена столбцов не совпадают, и если у вас есть несоответствие типов. Тогда он сделает все возможное, чтобы объединить data.frames в любом случае. Ограничение состоит в том, что вы можете одновременно комбинировать только два фрейма данных.
источник
Может быть, я полностью неправильно понял ваш вопрос, но «я надеюсь сохранить столбцы, которые не совпадают после привязки», заставляет меня думать, что вы ищете
left join
илиright join
похож на SQL-запрос. В R естьmerge
функция, которая позволяет вам указывать левое, правое или внутреннее соединение, аналогичное соединению таблиц в SQL.Здесь уже есть большой вопрос и ответ по этой теме: Как объединить (объединить) фреймы данных (внутренний, внешний, левый, правый)?
источник
gtools / smartbind не нравилось работать с датами, вероятно, потому что это было как .vectoring. Итак, вот мое решение ...
источник
Просто для документации. Вы можете попробовать
Stack
библиотеку и ее функцииStack
в следующей форме:У меня также сложилось впечатление, что это быстрее, чем другие методы для больших наборов данных.
источник
Вы также можете использовать
sjmisc::add_rows()
, который используетdplyr::bind_rows()
, но в отличие от негоbind_rows()
,add_rows()
сохраняет атрибуты и, следовательно, полезен для помеченных данных .Смотрите следующий пример с помеченным набором данных.
frq()
-Функции печатают таблицы частот с метками значений, если данные помечены.источник
источник