6.14 合并数据框

6.14 合并数据框

6.14.1 问题

你想要基于一个给定的列合并两个数据框(像 SQL 的 join)。

6.14.2 方案

## 创建一个将 storyid 映射到 titles 上的数据框
stories <- read.table(header = TRUE, text = "
   storyid  title
  1       lions
  2      tigers
  3       bears
")

## 创建另一个有数据和 storyid 的数据框(没有 titles)
data <- read.table(header = TRUE, text = "
  subject storyid rating
      1       1    6.7
      1       2    4.5
      1       3    3.7
      2       2    3.3
      2       3    4.1
      2       1    5.2
")

## 合并两个数据框
merge(stories, data, "storyid")
#>   storyid  title subject rating
#> 1       1  lions       1    6.7
#> 2       1  lions       2    5.2
#> 3       2 tigers       1    4.5
#> 4       2 tigers       2    3.3
#> 5       3  bears       1    3.7
#> 6       3  bears       2    4.1

如果两个数据框里你想要匹配的列有不同的名字,可以通过选项指定:

## 下面使用的是 id 替换了 storyid
stories2 <- read.table(header = TRUE, text = "
   id       title
  1       lions
  2      tigers
  3       bears
")

## 合并两个数据框
merge(x = stories2, y = data, by.x = "id", by.y = "storyid")
#>   id  title subject rating
#> 1  1  lions       1    6.7
#> 2  1  lions       2    5.2
#> 3  2 tigers       1    4.5
#> 4  2 tigers       2    3.3
#> 5  3  bears       1    3.7
#> 6  3  bears       2    4.1

## 注意结果的列名继承第一个数据框

我们也可以合并多个列:

## 制造更多的数据
animals <- read.table(header = T, text = "
   size type         name
  small  cat         lynx
  big  cat        tiger
  small  dog    chihuahua
  big  dog \"great dane\"
")

observations <- read.table(header = T, text = "
   number  size type
    1   big  cat
    2 small  dog
    3 small  dog
    4   big  dog
")

merge(observations, animals, c("size", "type"))
#>    size type number       name
#> 1   big  cat      1      tiger
#> 2   big  dog      4 great dane
#> 3 small  dog      2  chihuahua
#> 4 small  dog      3  chihuahua

6.14.3 注意

合并之后,改变列名的顺序可能是有用的,参见对数据框的列重新排序 。