Объединение кадров данных в 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 для отсутствующего автора во фрейме данных книг.