Учебники

10) Объединить кадры данных в R

Очень часто у нас есть данные из нескольких источников. Чтобы выполнить анализ, нам нужно объединить два кадра данных вместе с одной или несколькими общими ключевыми переменными .

В этом уроке вы узнаете

Полное совпадение

Полное совпадение возвращает значения, которые имеют аналог в таблице назначения. Значения, которые не совпадают, не будут возвращены в новом фрейме данных. Частичное совпадение, однако, возвращает отсутствующие значения как NA.

Мы увидим простое внутреннее соединение . Ключевое слово inner join выбирает записи, которые имеют совпадающие значения в обеих таблицах. Чтобы объединить два набора данных, мы можем использовать функцию 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

Давайте объединяем фреймы данных, когда переменные общего ключа имеют разные имена.

Мы меняем фамилию на имя в кадре данных фильмов. Мы используем функцию identifier (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 для пропавшего автора во фрейме данных книг.