📜  如何在 R 中合并两个数据帧?(1)

📅  最后修改于: 2023-12-03 15:24:20.820000             🧑  作者: Mango

如何在 R 中合并两个数据帧?

在数据分析过程中,经常需要将不同来源的数据按照一定的规则进行合并,这就需要用到R中的合并操作。本文将介绍在R中合并两个数据帧的方法。

1. merge()函数

在R语言中,可以使用merge()函数来将两个数据帧按照某些列进行合并。语法如下:

merge(x, y, by, all = FALSE, all.x = all, all.y = all, sort = TRUE, suffixes = c(".x",".y"), ...)

其中,

  • x:要合并的第一个数据帧;
  • y:要合并的第二个数据帧;
  • by:指定要合并的列名或者列名的编号,如果不指定,则默认使用相同的列名进行合并;
  • all:逻辑值,如果为TRUE,则将所有的行合并,包括那些只在一个数据框中出现的行,默认值为FALSE;
  • all.x:逻辑值,如果为TRUE,则将x数据框中的所有行都保留在结果中,即使它们在y数据框中没有匹配项。默认值为all;
  • all.y:逻辑值,如果为TRUE,则将y数据框中的所有行都保留在结果中,即使它们在x数据框中没有匹配项。默认值为all;
  • sort:逻辑值,如果为TRUE,则按照列名的字母顺序排序,默认为TRUE;
  • suffixes:长度为2的字符向量,用于标识来自x和y的重复列名的后缀。

以下是一个示例:

# 创建两个数据框
df1 <- data.frame(id = 1:4, name = c("A", "B", "C", "D"))
df2 <- data.frame(id = 2:5, age = c(20, 30, 25, 18))

# 合并两个数据框
merge(df1, df2, by = "id")

输出结果如下:

  id name age
1  2    B  20
2  3    C  30
3  4    D  25

其中,合并的列为"id",结果中只包含两个数据框中都存在的"id"对应的行。

2. join函数

除了使用merge()函数,R中还提供了一系列类似SQL中JOIN操作的函数,例如inner_join、left_join、right_join和full_join。

这些函数的语法类似于merge()函数,不同之处在于它们默认使用某些JOIN操作进行合并。例如:

  • inner_join:内连接,返回两个数据框中都存在的行;
  • left_join:左连接,返回左侧数据框中所有行以及与右侧数据框中对应行匹配的行;
  • right_join:右连接,返回右侧数据框中所有行以及与左侧数据框中对应行匹配的行;
  • full_join:全连接,返回两个数据框中的所有行。

以下是一个示例:

# 创建两个数据框
df1 <- data.frame(id = 1:4, name = c("A", "B", "C", "D"))
df2 <- data.frame(id = 2:5, age = c(20, 30, 25, 18))

# inner join
inner_join(df1, df2, by = "id")

# left join
left_join(df1, df2, by = "id")

# right join
right_join(df1, df2, by = "id")

# full join
full_join(df1, df2, by = "id")

其中,inner_join、left_join、right_join和full_join的输出结果分别如下:

  id name age
1  2    B  20
2  3    C  30
3  4    D  25
  id name age
1  1    A  NA
2  2    B  20
3  3    C  30
4  4    D  25
  id name age
1  2    B  20
2  3    C  30
3  4    D  25
4  5 <NA>  18
  id name age
1  1    A  NA
2  2    B  20
3  3    C  30
4  4    D  25
5  5 <NA>  18

可以看出,不同的JOIN操作返回的结果不同,使用时需要根据实际情况进行选择。

3. 总结

在R语言中,使用merge()函数或者其他JOIN函数可以方便地对两个数据框进行合并操作。通过指定合并的列名或者列名的编号,可以控制合并的方式,便于数据分析人员根据实际情况进行操作。