2013-12-16 98 views
1

我有兩個數據幀,看起來像這樣如何加入data.frames :基於兩列

t1 t2  val 
1 a x1 -1.183606 
2 b x2 -1.358457 
3 c x3 -1.512671 
4 d x4 -1.253105 
# surely the val columns will differ since we use rnorm() 

我想要做的是基於H2-H3在D2 D1和T1-T2柱D1和D2結合,導致

foo a x1 -1.183606 
foo b x2 -1.358457 
bar c x3 -1.512671 
bar d x4 -1.253105 

什麼是做到這一點的呢?

回答

2

合併可與多個鍵,並且可以使用每邊有不同的列名。對於by規格,x是第一數據幀,y是第二:

merge(d1, d2, by.x=c('h2', 'h3'), by.y=c('t1', 't2')) 
## h2 h3 h1   val 
## 1 a x1 foo -0.04356036 
## 2 b x2 foo 0.56975774 
## 3 c x3 bar 0.03251157 
## 4 d x4 bar -0.67823770 
1

我想這應該做的伎倆 - 你對每個數據幀中的列對上創建一個鍵,然後該鍵合併:

d1$key = paste(d1$h2, d1$h3) 
d2$key = paste(d2$t1, d2$t2) 
merged = merge(d1, d2) 
1

下面是使用data tables另一種方法。

連接對數據表非常有效。即使使用這些小數據集,數據表連接速度也快兩倍,但您不會注意到它。對於較大的數據集,差異是巨大的。

# data frames with 200,000 rows, same structure as OP's example 
df1 <- data.frame(h1=rep(c("foo","foo","bar","bar"),each=50000), 
        h2=rep(letters[1:20],1e4), 
        h3=rep(1:1e4,each=20)) 
df2 <- data.frame(t1=rep(letters[1:20],1e4), 
        t2=rep(1:1e4,each=20), 
        val=rnorm(2e5)) 
# time the merge (~8.4 sec) 
system.time(df.result <-merge(df1, df2, by.x=c('h2', 'h3'), by.y=c('t1', 't2'))) 
# user system elapsed 
# 8.41 0.02 8.42 

# convert to data tables and set keys 
library(data.table) 
dt1 <- data.table(df1, key="h2,h3") 
dt2 <- data.table(df2, key="t1,t2") 
# time the join (~0.2 sec) 
system.time(dt.result <- dt1[dt2]) 
# user system elapsed 
# 0.19 0.00 0.18 

底線:數據表連接在大型數據集上要快40倍以上。