6.14 合并数据框

6.14.1 问题

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

6.14.2 方案

  1. # 创建一个将 storyid 映射到 titles 上的数据框
  2. stories <- read.table(header = TRUE, text = "
  3. storyid title
  4. 1 lions
  5. 2 tigers
  6. 3 bears
  7. ")
  8. # 创建另一个有数据和 storyid 的数据框(没有 titles)
  9. data <- read.table(header = TRUE, text = "
  10. subject storyid rating
  11. 1 1 6.7
  12. 1 2 4.5
  13. 1 3 3.7
  14. 2 2 3.3
  15. 2 3 4.1
  16. 2 1 5.2
  17. ")
  18. # 合并两个数据框
  19. merge(stories, data, "storyid")
  20. #> storyid title subject rating
  21. #> 1 1 lions 1 6.7
  22. #> 2 1 lions 2 5.2
  23. #> 3 2 tigers 1 4.5
  24. #> 4 2 tigers 2 3.3
  25. #> 5 3 bears 1 3.7
  26. #> 6 3 bears 2 4.1

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

  1. # 下面使用的是 id 替换了 storyid
  2. stories2 <- read.table(header = TRUE, text = "
  3. id title
  4. 1 lions
  5. 2 tigers
  6. 3 bears
  7. ")
  8. # 合并两个数据框
  9. merge(x = stories2, y = data, by.x = "id", by.y = "storyid")
  10. #> id title subject rating
  11. #> 1 1 lions 1 6.7
  12. #> 2 1 lions 2 5.2
  13. #> 3 2 tigers 1 4.5
  14. #> 4 2 tigers 2 3.3
  15. #> 5 3 bears 1 3.7
  16. #> 6 3 bears 2 4.1
  17. # 注意结果的列名继承第一个数据框

我们也可以合并多个列:

  1. # 制造更多的数据
  2. animals <- read.table(header = T, text = "
  3. size type name
  4. small cat lynx
  5. big cat tiger
  6. small dog chihuahua
  7. big dog \"great dane\"
  8. ")
  9. observations <- read.table(header = T, text = "
  10. number size type
  11. 1 big cat
  12. 2 small dog
  13. 3 small dog
  14. 4 big dog
  15. ")
  16. merge(observations, animals, c("size", "type"))
  17. #> size type number name
  18. #> 1 big cat 1 tiger
  19. #> 2 big dog 4 great dane
  20. #> 3 small dog 2 chihuahua
  21. #> 4 small dog 3 chihuahua

6.14.3 注意

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