2014-11-03 78 views
1

在R中矢量化數據框中數據的計算是否可能,其中執行計算的一個條件來自外部數據框?這可以使用進行循環執行,但速度很慢。在R中的關係數據框中矢量化計算

完整的任務涉及以關係格式詢問15年的醫學實驗室數據。例如,外科手術後三個月內患者記錄的最低血紅蛋白水平是多少?這來自兩個表格:一個具有手術日期(約6000,通常每個患者多個)和一個過期血紅蛋白水平(約200,000,每個患者多個)。下面的循環每個查詢需要大約30分鐘。

在此MWE數據位於兩個表中並通過索引進行鏈接。

##create two dataframes 
a<-c("ID1","ID2","ID3","ID2","ID1") 
b<-c(1,2,3,4,5) 
c<-as.Date(c("2005-01-01","2002-01-01","2003-01-01","2004-01-01","2001-01-01")) 
df.1<-cbind.data.frame(a,b,c,stringsAsFactors=FALSE) 

d<-c("ID1","ID2","ID1") 
e<-as.Date(c("2002-02-01","2001-02-01","2000-01-01")) 
df.2<-cbind.data.frame(d,e,stringsAsFactors=FALSE)   

>df.1 
    a b  c 
1 ID1 1 2005-01-01 
2 ID2 2 2002-01-01 
3 ID3 3 2003-01-01 
4 ID2 4 2004-01-01 
5 ID1 5 2001-01-01 
>df.2 
    d  e 
1 ID1 2002-02-01 
2 ID2 2001-02-01 
3 ID1 2000-01-01 


out<-rep(NA,length(df.2$d)) 
for(i in 1:length(df.2$d)){ 
out[i]<-max(df.1$b[df.1$a==df.2$d[i] & df.1$c>df.2$e[i]]) 
} 


> cbind(df.2,out) 
    d  e  out 
1 ID1 2002-02-01 1 
2 ID2 2001-02-01 4 
3 ID1 2000-01-01 5 
+0

這個:'df.1 $ a == df.2 $ d [i]'對整個列測試一個值,而邏輯表達式的另一半也是這樣。結果用作列索引。這真的沒有意義。那麼你試圖完成什麼?無論如何? – 2014-11-03 04:42:28

回答

1

要回答你的問題,你可以在r中進行矢量計算與Vectorize

但是,我不確定這裏「慢」是什麼意思。並且有可能有更好的方法來完成你的任務,但我寧願讀代碼而不是代碼。

##create two dataframes 
a<-c("ID1","ID2","ID3","ID2","ID1") 
b<-c(1,2,3,4,5) 
c<-as.Date(c("2005-01-01","2002-01-01","2003-01-01","2004-01-01","2001-01-01")) 
df.1<-cbind.data.frame(a,b,c,stringsAsFactors=FALSE) 

d<-c("ID1","ID2","ID1") 
e<-as.Date(c("2002-02-01","2001-02-01","2000-01-01")) 
df.2<-cbind.data.frame(d,e,stringsAsFactors=FALSE)   

f <- function(i) 
    ## your code here 
    max(df.1$b[df.1$a==df.2$d[i] & df.1$c>df.2$e[i]]) 
vf <- Vectorize(f) 

vf(1:3) 
# [1] 1 4 5 
+0

儘管它的名字,'Vectorize'唯一的事情就是用'mapply'創建一個隱式循環。這不會更快。 – 2014-11-03 03:47:34

+0

true ..我打算評論基準測試,但有3行,這沒有關係 – rawr 2014-11-03 03:54:53

+0

它只是將無意義向量化,你沒有改善世界。 – 2014-11-03 04:43:31