Обединяване на кадри с данни в 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
Нека обединим рамки с данни, когато общите ключови променливи имат различни имена.
Променяме фамилното име на име в рамката с данни за филми. Използваме функцията 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 за липсващия автор в рамката с данни на книгите.

