R语言 数据帧合并


通常,我们有来自多个来源的数据。要执行分析,我们需要将两个数据变量与一个或多个关键变量合并在一起。


全匹配

全匹配返回目标表中具有对等项的值。不匹配的值将不会在新的数据帧中返回。但是,部分匹配将以NA的形式返回缺少的值。

我们将看到一个简单的内连接。inner join关键字选择两个表中值匹配的记录。要连接两个数据集,可以使用merge()函数。我们将使用三个参数:

语法

参数 描述
x 原始数据帧。
y 要合并的数据帧。
by.x 在x数据帧中用于合并的列。合并列x。
by.y 在y数据帧中用于合并的列。合并y列。

创建带有变量的第一个数据集:

  • surname
  • nationality

创建带有变量的第二个数据集:

  • surname
  • movies

常见的关键变量是姓氏。我们可以合并数据并检查维数是否为7×3。

我们在数据帧中添加stringsAsFactors=FALSE,因为我们不希望R将字符串转换为因子,我们希望变量被视为字符。


# 创建源数据帧

producers <- data.frame(   
    surname =  c("Spielberg","Scorsese","Hitchcock","Tarantino","Polanski"),    
    nationality = c("US","US","UK","US","Poland"),    
    stringsAsFactors=FALSE)

# 创建目标数据帧
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)

# 合并两个数据集
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)函数来检查两个数据变量是否相同。


# 更改“movies”数据名称
colnames(movies)[colnames(movies) == 'surname'] <- 'name'
# 合并不同的键值
m2 <- merge(producers, movies, by.x = "surname", by.y = "name")
# 打印数据头
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

检查数据是否相同:


identical(m1, m2)
[1] TRUE

这表明即使列名不同,也会执行合并操作。


部分匹配

两个数据数据库没有相同的公共关键变量并不奇怪。在完全匹配中,数据帧只返回在x和y数据帧中都能找到的行。

通过部分合并,可以将不匹配的行保留在其他数据框架中。这些行中有NA的列通常都是y的值,我们可以通过设置all.x = TRUE来实现 。

例如,我们可以在生成器数据框架中添加一个新的生成器Lucas,而不需要在movies数据框架中添加影片引用。如果我们设置all.x = FALSE,R将只连接两个数据集中匹配的值。在我们的例子中,生成器Lucas将不会连接到合并,因为它在一个数据集中丢失了。

让我们看看当指定all.x=TRUE时,以及相反时每个输出的维度 。


# 创建一个新的生成器
add_producer <-  c('Lucas', 'US')
# 将其附加到“producer”数据帧中
producers <- rbind(producers, add_producer)
# 使用部分合并
m3 <-merge(producers, movies, by.x = "surname", by.y = "name", all.x = TRUE)
m3

结果

结果

# 比较每个数据帧的尺寸
dim(m1)
[1] 7 3

dim(m2)
[1] 7 3

dim(m3)
[1] 8 3

我们可以看到,新的数据帧的维数为8x3,而m1和m2的维数为7x3。R包含图书数据框中缺少作者的NA。




公众号

关注公众号,获取一手资讯

“ R语言 数据帧合并 ” comments 0

评论/回复

电子邮件地址不会被公开。 必填项已用*标注