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 注意
合并之后,改变列名的顺序可能是有用的,参见对数据框的列重新排序 。