Обединяване на кадри с данни в 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 за липсващия автор в рамката с данни на книгите.

Обобщете тази публикация с: