R中跨关系数据帧的矢量化计算

R中跨关系数据帧的矢量化计算,r,for-loop,relational-database,vectorization,R,For Loop,Relational Database,Vectorization,在R中,当执行计算的一个标准来自外部数据帧时,是否可以对数据帧中的数据进行矢量化计算?这可以使用for循环执行,但是速度很慢 整个任务包括以关系格式询问15年医学实验室数据的问题。例如,患者在手术后三个月内记录的最低血红蛋白水平是多少?这来自两个表格:一个有手术日期(~6000,通常每位患者多次)和一个有日期血红蛋白水平(~200000,每位患者多次)。下面的循环每次查询大约需要30分钟 在本文件中,MWE数据位于两个表中,并通过索引链接 ##create two dataframes a<

在R中,当执行计算的一个标准来自外部数据帧时,是否可以对数据帧中的数据进行矢量化计算?这可以使用for循环执行,但是速度很慢

整个任务包括以关系格式询问15年医学实验室数据的问题。例如,患者在手术后三个月内记录的最低血红蛋白水平是多少?这来自两个表格:一个有手术日期(~6000,通常每位患者多次)和一个有日期血红蛋白水平(~200000,每位患者多次)。下面的循环每次查询大约需要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
##创建两个数据帧

a要回答您的问题,您可以使用
vectorize
将r中的计算矢量化

然而,我不确定这里的“慢”是什么意思。也许有更好的方法来完成你的任务,但我宁愿读一个单词问题而不是代码

##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
##创建两个数据帧

无论名称如何,
Vectorize
所做的唯一事情就是使用
mapply
创建一个隐式循环。不会再快了没错。。我本来打算对基准进行评论,但有3行,这并不重要。你只是将胡说八道矢量化,你没有改善世界。这:
df.1$a==df.2$d[I]
针对整个列测试单个值,该逻辑表达式的另一半也是如此。结果将用作列索引。这真的毫无意义。那么你想要完成的是什么呢。无论如何