問題
你想要基于一個給定的列融合兩個數(shù)據(jù)框(像SQL的join)二蓝。
方案
# 創(chuàng)建一個將storyid映射到titles上的數(shù)據(jù)框
stories <- read.table(header=TRUE, text='
storyid title
1 lions
2 tigers
3 bears
')
# 創(chuàng)建另一個有數(shù)據(jù)和storyid的數(shù)據(jù)框(沒有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
')
# 融合兩個數(shù)據(jù)框
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
如果兩個數(shù)據(jù)框里你想要匹配的列有不同的名字胸嘁,可以通過選項指定:
# 下面使用的是`id`替換了storyid
stories2 <- read.table(header=TRUE, text='
id title
1 lions
2 tigers
3 bears
')
# 融合兩個數(shù)據(jù)框
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
# 注意結(jié)果的列名繼承第一個數(shù)據(jù)框
我們也可以融合多個列:
# 制造更多的數(shù)據(jù)
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
注意
融合之后,改變列名的順序可能是 有用的凹蜂,參見../Reordering the columns in a data frame 馍驯。