2016-02-05 68 views
0

速度 - 高達合併dataframes下面我得到了與結構(列)兩個數據幀:基於特殊標準

Price ["CID","Startdate","Enddate","P1","P2"] 

Usage ["Date","Hour","CID","Value"] 

我試圖與用法合併價格。我想「使用」裏面P1和P2值,通過檢查相應的「CID」和「價格」「日期」值

這是我下面的R代碼裏面:

t_cid=Price$CID 

Startdate=Price$Startdate 
Enddate=Price$Enddate 


fv <-function(x){ 

p<-Price[ (t_cid==x[3]) & (x[1] >=Startdate) &(x[1] <=Enddate),c("P1","P2")] 
return(list(p)) 
} 

t1=Sys.time() 

k=unlist(apply(Usage,1,fv)) 

t2=Sys.time() 

print(t2-t1) 

v=rep(c(TRUE,FALSE),length(k)/2) 

Usage$P1=k[v] 
Usage$P2=k[!v] 

矢量V以單獨的P1和選自K

合力數據幀P2的值:使用

["Date","Hour","CID","Value","P1","P2"] 

該邏輯works.But我想增加速度歧管(6-10倍)。任何幫助將不勝感激。提前感謝。

+0

考慮使用「data.table」包... http://www.openanalytics.eu/blog/need-processing-speed-datatable – WD11

回答

1

data.table太棒了。

起初:下次請提供一些示例數據,說明您的數據實際是什麼樣子。它有助於查看可以使用的附加信息。我自己做了一個樣本,請看看我是否正確。

Price <- data.table(
    CID = rep(c(1, 2), 1, each = 5), 
    Startdate = rep(seq(Sys.Date(), by = "2 day", length.out = 5), 2), 
    Enddate = rep(seq(Sys.Date() + 1, by = "2 day", length.out = 5), 2),  
    P1 = runif(10), P2 = rnorm(10) 
) 

Usage = data.table(
    Date = rep(seq(Sys.Date(), by = "2 day", length.out = 4), 2), 
    Hour = 6:13, 
    CID = rep(c(1, 2),2, each = 2), 
    Value = runif(8) 
) 

請注意,這些已被定義爲data.tables。只要運行dt <- data.table(df)從任何data.frame

所以在這裏創建一個data.table是您的交易:由

Usage[ , P1 := Price[.BY$Date >= Startdate & .BY$Date <= Enddate & CID == .BY$CID, P1], by = c("Date", "CID")] 
Usage[ , P2 := Price[.BY$Date >= Startdate & .BY$Date <= Enddate & CID == .BY$CID, P2], by = c("Date", "CID")] 

Assumtions:有一個在Price只有一行在UsageCIDDate每個組合。

查看data.table文檔獲取更多信息,因爲這可能會炸掉這篇文章。

玩得開心!

+0

非常感謝。這正是我正在尋找的! Data.table真的很酷。我將檢查data.table文檔。 – sandy