【发布时间】:2014-11-03 03:00:39
【问题描述】:
是否可以在 R 中对数据帧中的数据进行矢量化计算,其中执行计算的一个标准来自外部数据帧?这可以使用 for 循环 来执行,但是速度很慢。
完整的任务涉及以关系格式对 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
【问题讨论】:
-
This:
df.1$a==df.2$d[i]针对整个列测试单个值,该逻辑表达式的另一半也是如此。结果用作列索引。这真的毫无意义。那么你想要完成的是什么。无论如何?
标签: r for-loop relational-database vectorization