Объединение кадров данных в R: полное и частичное совпадение
Очень часто у нас есть данные из нескольких источников. Для проведения анализа нам необходимо слияние два фрейма данных вместе с одним или несколькими общие ключевые переменные.
В этом руководстве вы узнаете
Полное совпадение
Полное совпадение возвращает значения, имеющие аналог в целевой таблице. Несовпадающие значения не будут возвращены в новом фрейме данных. Однако частичное совпадение возвращает пропущенные значения как NA.
Мы увидим простой внутреннее соединение. Ключевое слово внутреннего соединения выбирает записи, имеющие совпадающие значения в обеих таблицах. Чтобы объединить два набора данных, мы можем использовать функцию merge(). Мы будем использовать три аргумента:
merge(x, y, by.x = x, by.y = y) Arguments: -x: The origin data frame -y: The data frame to merge -by.x: The column used for merging in x data frame. Column x to merge on -by.y: The column used for merging in y data frame. Column y to merge on
Пример:
Создайте первый набор данных с переменными
- фамилия
- гражданство
Создайте второй набор данных с переменными
- фамилия
- кино
Общей ключевой переменной является фамилия. Мы можем объединить оба данных и проверить, равна ли размерность 7×3.
Мы добавляем stringsAsFactors=FALSE во фрейм данных, потому что не хотим R чтобы преобразовать строку как фактор, мы хотим, чтобы переменная рассматривалась как символ.
# Create origin dataframe( producers <- data.frame( surname = c("Spielberg","Scorsese","Hitchcock","Tarantino","Polanski"), nationality = c("US","US","UK","US","Poland"), stringsAsFactors=FALSE) # Create destination dataframe movies <- data.frame( surname = c("Spielberg", "Scorsese", "Hitchcock", "Hitchcock", "Spielberg", "Tarantino", "Polanski"), title = c("Super 8", "Taxi Driver", "Psycho", "North by Northwest", "Catch Me If You Can", "Reservoir Dogs","Chinatown"), stringsAsFactors=FALSE) # Merge two datasets m1 <- merge(producers, movies, by.x = "surname") m1 dim(m1)
Вывод:
surname nationality title 1 Hitchcock UK Psycho 2 Hitchcock UK North by Northwest 3 Polanski Poland Chinatown 4 Scorsese US Taxi Driver 5 Spielberg US Super 8 6 Spielberg US Catch Me If You Can 7 Tarantino US Reservoir Dogs
Давайте объединим фреймы данных, когда общие ключевые переменные имеют разные имена.
Мы меняем фамилию на имя в кадре данных фильмов. Мы используем функцию идентичных (x1, x2), чтобы проверить, идентичны ли оба кадра данных.
# Change name of ` movies ` dataframe colnames(movies)[colnames(movies) == 'surname'] <- 'name' # Merge with different key value m2 <- merge(producers, movies, by.x = "surname", by.y = "name") # Print head of the data head(m2)
Вывод:
##surname nationality title ## 1 Hitchcock UK Psycho ## 2 Hitchcock UK North by Northwest ## 3 Polanski Poland Chinatown ## 4 Scorsese US Taxi Driver ## 5 Spielberg US Super 8 ## 6 Spielberg US Catch Me If You Can
# Check if data are identical identical(m1, m2)
Вывод:
## [1] TRUE
Это показывает, что операция слияния выполняется, даже если имена столбцов разные.
Частичное совпадение
Неудивительно, что два фрейма данных не имеют одинаковых общих ключевых переменных. в полное соответствие, кадр данных возвращает Важно строки, найденные как в кадре данных x, так и в y. С частичное слияние, можно сохранить строки без совпадающих строк в другом фрейме данных. Эти строки будут иметь NA в тех столбцах, которые обычно заполняются значениями из y. Мы можем сделать это, установив all.x= TRUE.
Например, мы можем добавить нового продюсера Лукаса в кадр данных продюсера без ссылок на фильмы в кадре данных фильмов. Если мы установим all.x= FALSE, R объединит только совпадающие значения в обоих наборах данных. В нашем случае производитель Лукас не будет участвовать в слиянии, поскольку он отсутствует в одном наборе данных.
Давайте посмотрим размер каждого вывода, когда мы указываем all.x= TRUE, а когда нет.
# Create a new producer add_producer <- c('Lucas', 'US') # Append it to the ` producer` dataframe producers <- rbind(producers, add_producer) # Use a partial merge m3 <-merge(producers, movies, by.x = "surname", by.y = "name", all.x = TRUE) m3
Вывод:
# Compare the dimension of each data frame dim(m1)
Вывод:
## [1] 7 3
dim(m2)
Вывод:
## [1] 7 3
dim(m3)
Вывод:
## [1] 8 3
Как мы видим, размерность нового фрейма данных 8×3 по сравнению с 7×3 для m1 и m2. R включает NA для отсутствующего автора во фрейме данных книг.