【问题标题】:Vectorize calculation across relational dataframes in R在 R 中跨关系数据帧矢量化计算
【发布时间】: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


【解决方案1】:

要回答您的问题,您可以使用 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 创建一个隐式循环。它不会更快。
  • true.. 我打算对基准发表评论,但有 3 行,没关系
  • 你只是把废话向量化,你并没有改善世界。
猜你喜欢
  • 1970-01-01
  • 2019-11-19
  • 2018-01-31
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 2013-07-07
  • 2012-06-16
  • 2019-06-18
相关资源
最近更新 更多