Злиття кадрів даних у R: повна та часткова відповідність

Дуже часто ми маємо дані з кількох джерел. Щоб провести аналіз, нам потрібно злиття два кадри даних разом з одним або кількома загальні ключові змінні.

У цьому підручнику ви дізнаєтесь

Повний матч

Повний збіг повертає значення, які мають відповідник у цільовій таблиці. Значення, які не збігаються, не повертатимуться в новому кадрі даних. Однак частковий збіг повертає відсутні значення як NA.

Ми побачимо простий inner join. Ключове слово 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

Давайте об’єднаємо кадри даних, якщо загальні ключові змінні мають різні імена.

Змінюємо прізвище на ім'я у кадрі даних фільмів. Ми використовуємо функцію identical(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 об’єднає лише відповідні значення в обох наборах даних. У нашому випадку продюсер Lucas не буде приєднаний до злиття, оскільки він відсутній в одному наборі даних.

Давайте подивимося розмірність кожного виводу, коли ми вказуємо 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 для відсутнього автора у кадрі даних книги.