R имеет множество удобных функций для объединения и добавления нескольких фреймов данных. В частности, я хотел бы осветить случай, когда у вас есть несколько фреймов данных с одними и теми же столбцами, которые вы хотите объединить.

В качестве примера давайте разделим набор данных об НЛО из Kaggle на несколько частей и посмотрим, как мы можем легко собрать их вместе.

Чтобы разделить данные, мы будем использовать следующую функцию, разработанную kcha:

ufos <- read.csv("scrubbed.csv")
splitDf <- split_k(ufos,4)

Мы разбиваем данные на четыре фрейма: ufo1, ufo2, ufo3 и ufo4.

ufo1 <- splitDf$`1`
ufo2 <- splitDf$`2`
ufo3 <- splitDf$`3`
ufo4 <- splitDf$`4`

Теперь, если мы хотим объединить вместе только первые два фрейма данных, мы могли бы использовать rbind следующим образом:

ufo1And2 <- rbind(ufo1,ufo2)

Как мы можем подтвердить с помощью NROW, что данные были успешно объединены:

> NROW(ufo1)
[1] 20083
> NROW(ufo2)
[1] 20083
> NROW(ufo1And2)
[1] 40166

Однако, поскольку мы разделили наши данные на четыре части, не исключено, что мы захотим объединить четыре фрейма данных. Rbind as is принимает только два фрейма данных, поэтому нам нужно немного скорректировать наш код, чтобы разместить больше фреймов данных.

Объединение более двух фреймов данных

Чтобы объединить более двух фреймов данных в R, мы можем объединить наш вызов rbind с do.call.

do.call("rbind", list(dataframes to merge))

Как это работает:

Функция do.call позволяет нам использовать любые существующие функции R, такие как вышеупомянутый rbind, но вместо передачи только двух фреймов данных в этом случае мы можем передать несколько.

Следовательно, при использовании вместе с rbind мы можем использовать do.call для одновременного слияния более двух фреймов данных.

Собирая все это вместе, мы можем снова объединить наши фреймы данных НЛО следующим образом:

ufoMerged <- do.call("rbind", list(ufo1, ufo2, ufo3, ufo4))

Мы можем подтвердить, что наши данные были успешно объединены, проверив количество строк:

> NROW(ufoMerged)
[1] 80332
> NROW(ufos)
[1] 80332

И, выполнив anti_join с помощью dplyr, который возвращает null:

library(dplyr)
ufoChecker <- anti_join(ufoMerged, ufos)
ufoChecker
 [1] datetime             city                 state                country             
 [5] shape                duration..seconds.   duration..hours.min. comments            
 [9] date.posted          latitude             longitude           
<0 rows> (or 0-length row.names)

Это всего лишь один из методов объединения нескольких фреймов данных, и на R-Bloggers вы можете найти сравнения скорости для альтернативных методов. Однако я считаю do.call в сочетании с rbind одним из самых интуитивно понятных методов для объединения нескольких фреймов данных.

Полезные ресурсы



Также прочтите

Получайте лучшие предложения по программному обеспечению прямо в свой почтовый ящик