2012-05-06 25 views
3

我有一個看起來像像兩個數據幀如下:加入一個數據幀到另一個成員

df1 <- data.frame(time=seq(0.0, by = 0.003, length.out = 1000)) 

    time 
1 0.000 
2 0.003 
3 0.006 
4 0.009 
5 0.012 
6 0.015 
... 

df2 <- data.frame(onset=c(0.0, 0.8, 1.9, 2.4), offset=c(0.799, 1.899, 2.399, 3.0)) 

    onset offset A B 
1 0.0 0.799 ... ... 
2 0.8 1.899 ... ... 
3 1.9 2.399 ... ... 
4 2.4 3.000 ... ... 

在現實中有每個數據幀的多個列,並有在第一個數據幀中有更多次,而且它們並不是有規律的間隔;第二個數據框中沒有太多的行。我想合併兩個數據幀,使得第一個數據幀中的每一行都從第二個數據幀中獲得適當範圍的額外列,並且我希望高效地完成此操作,因爲涉及到數十萬行。

+1

'cut'? ........ –

回答

5

您可以使用findInterval的時間與相應的onset匹配,則merge你的兩個data.frames:

df1$onset <- df2$onset[findInterval(df1$time, df2$onset)] 
df3 <- merge(df1, df2, by = "onset") 

head(df3) 
# onset time offset 
# 1  0 0.000 0.799 
# 2  0 0.003 0.799 
# 3  0 0.006 0.799 
# 4  0 0.009 0.799 
# 5  0 0.012 0.799 
# 6  0 0.015 0.799 

tail(df3) 
#  onset time offset 
# 995 2.4 2.982  3 
# 996 2.4 2.985  3 
# 997 2.4 2.988  3 
# 998 2.4 2.991  3 
# 999 2.4 2.994  3 
# 1000 2.4 2.997  3 
2

可以爲每個準備的因素,然後用plyr ::加入:

# breaks for 'cut' 
times=c(df2$onset[1],df2$offset) 

# modified df1 to shorten the list 
df1 <- data.frame(time=seq(0.0, by = 0.03, length.out = 100)) 

# Add a few columns to df2 
df2 <- data.frame(onset=c(0.0, 0.8, 1.9, 2.4), offset=c(0.799, 1.899, 2.399, 3.0), A=c(1,2,3,4), B=c(5,6,7,8)) 


df2$ranges <-cut(df2$onset,times,include.lowest=T)) 
df1$ranges <-cut(df1$time,times,include.lowest=T,levels=levels(df2$ranges)) 

join(df1,df2,by='ranges') 

head(join(df1,df2,by='ranges')[-2]) 
    time onset offset A B 
1 0.00  0 0.799 1 5 
2 0.03  0 0.799 1 5 
3 0.06  0 0.799 1 5 
4 0.09  0 0.799 1 5 
5 0.12  0 0.799 1 5 
6 0.15  0 0.799 1 5 
0

使用sqldf第三選擇以執行conditional join

> head(sqldf("select * 
+   from df1 inner join df2 
+      on (df1.time between df2.onset and df2.offset)")) 

頭輸出:

time onset offset 
1 0.000  0 0.799 
2 0.003  0 0.799 
3 0.006  0 0.799 
4 0.009  0 0.799 
5 0.012  0 0.799 
6 0.015  0 0.799 

內部聯接將擺脫沒有範圍之間DF2適應時間。如果你想保留這些時間,並且在開始和結束時有空值,只需要left join而不是inner join在上面的sqldf函數的SQL中。

相關問題