在 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 数据框中均找到行。使用 部分合并,可以保留另一个数据框中没有匹配行的行。这些行在通常用 y 的值填充的列中将为 NA。我们可以通过设置 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
输出:
# Compare the dimension of each data frame dim(m1)
输出:
## [1] 7 3
dim(m2)
输出:
## [1] 7 3
dim(m3)
输出:
## [1] 8 3
我们可以看到,新数据框的尺寸为 8×3,而 m7 和 m3 的尺寸为 1×2。R 在书籍数据框中包含了缺失作者的 NA。