Злиття кадрів даних у 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 для відсутнього автора у кадрі даних книги.