รวมเฟรมข้อมูลใน R: การจับคู่แบบเต็มและบางส่วน

บ่อยครั้งที่เรามีข้อมูลจากหลายแหล่ง เพื่อทำการวิเคราะห์ เราจำเป็นต้อง ผสาน สอง dataframes ร่วมกับหนึ่งหรือมากกว่าหนึ่ง ตัวแปรสำคัญทั่วไป.

ในบทช่วยสอนนี้ คุณจะได้เรียนรู้

แมตช์เต็มๆ

การจับคู่แบบเต็มจะส่งกลับค่าที่มีคู่กันในตารางปลายทาง ค่าที่ไม่ตรงกันจะไม่ถูกส่งกลับในกรอบข้อมูลใหม่ อย่างไรก็ตาม การจับคู่บางส่วนจะส่งกลับค่าที่หายไปเป็น NA

เราจะเห็นแบบง่ายๆ เข้าร่วมภายใน- คำสำคัญการรวมภายในจะเลือกเรกคอร์ดที่มีค่าที่ตรงกันในทั้งสองตาราง หากต้องการรวมชุดข้อมูลสองชุดเข้าด้วยกัน เราสามารถใช้ฟังก์ชัน 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 ใน data frame เพราะเราไม่ต้องการ 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)

Output:

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

มาผสานเฟรมข้อมูลเมื่อตัวแปรคีย์ทั่วไปมีชื่อต่างกัน

เราเปลี่ยนนามสกุลเป็นชื่อในกรอบข้อมูลภาพยนตร์ เราใช้ฟังก์ชันเหมือนกัน (x1, x2) เพื่อตรวจสอบว่า dataframe ทั้งสองเหมือนกันหรือไม่

# 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)

Output:

##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)

Output:

## [1] TRUE

สิ่งนี้แสดงให้เห็นว่ามีการดำเนินการผสานแม้ว่าชื่อคอลัมน์จะแตกต่างกันก็ตาม

การจับคู่บางส่วน

จึงไม่น่าแปลกใจที่ dataframe สองตัวไม่มีตัวแปรคีย์ที่เหมือนกัน ใน การจับคู่เต็มรูปแบบ, dataframe ส่งคืน เพียง แถวที่พบในกรอบข้อมูล x และ y กับ การรวมบางส่วนเป็นไปได้ที่จะเก็บแถวโดยไม่มีแถวที่ตรงกันในกรอบข้อมูลอื่น แถวเหล่านี้จะมี NA ในคอลัมน์ที่ปกติจะเต็มไปด้วยค่าจาก y เราสามารถทำได้โดยการตั้งค่า all.x= TRUE

ตัวอย่างเช่น เราสามารถเพิ่มโปรดิวเซอร์รายใหม่ Lucas ในเฟรมข้อมูลโปรดิวเซอร์โดยไม่มีการอ้างอิงภาพยนตร์ในเฟรมข้อมูลภาพยนตร์ หากเราตั้งค่า 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

Output:

การแข่งขันบางส่วน

# Compare the dimension of each data frame
dim(m1)

Output:

## [1] 7 3
dim(m2)

Output:

## [1] 7 3
dim(m3)

Output:

## [1] 8 3

ดังที่เราเห็น มิติของกรอบข้อมูลใหม่ 8×3 เทียบกับ 7×3 สำหรับ m1 และ m2 R รวม NA สำหรับผู้แต่งที่หายไปในกรอบข้อมูลหนังสือ