2014-11-03 122 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