首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何优化一个循环中有2个输入的r函数

如何优化一个循环中有2个输入的r函数
EN

Stack Overflow用户
提问于 2018-03-27 22:00:53
回答 1查看 49关注 0票数 2

我对r很陌生,我对运行我认为相当简单的代码行所花费的时间感到惊讶,这使我相信我遗漏了一些相当明显的东西。我搜索过互联网,尝试了几次不同的函数迭代,但是没有什么能提高效率(用时间来衡量)。

提取的数据是一个有18.5m行和11个变量的数据帧。我想确定两件事,第一,在医院停留超过7%的病人占所有病人的百分比;第二,21天占7天的比例。

LOS_prob_providerage <- function(x,y){ Var1 = which(Extract$LOS>=0 & Extract$ProviderCode == x & Extract$age_group == y) Var2 = which(Extract$LOS>=7 & Extract$ProviderCode == x & Extract$age_group == y) return(list(Strand=(sum(Extract$LOS[Var1] >= 7)/length(Var1))*100, ELOS=(sum(Extract$LOS[Var2] >= 21)/length(Var2))*100)) }

当我调用这个函数时,我给它一个医院列表,作为x变量,从y变量列表中给出一个年龄组(我似乎无法让它同时作为列表,并使用以下代码输出所有年龄组的所有医院)

代码语言:javascript
复制
Providerage_prob_strand = mapply(LOS_prob_providerage,Provider_unique, agelabels[1], SIMPLIFY = FALSE)

然后使用函数使用下面的代码输出的2个列表创建一个数据框架。

代码语言:javascript
复制
 National = data.frame(matrix(unlist(Providerage_prob_strand), ncol=2, 
 byrow=T),row.names = Provider_unique)
 colnames(National) <- c("Stranded_010","ELOS_010")

随后,我重新运行我的年龄组列表中所有11个元素的最后部分代码,并附加到国家数据框架中。

问题1:是否有一种计算量较小的方法来使用r编写我的循环,还是循环由于r存储内存中的所有内容的方式而占用了这段时间?

问题2:是否有任何地方可以使用mapply/sapply给出x和y变量的两个列表,并将结果输出给所有医院的Strand和ELOS?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-27 23:23:16

为此,我将使用data.table包。

一些需要演示的虚拟数据(通常,提问者提供这样的数据是很好的做法):

代码语言:javascript
复制
set.seed(123)
df1 = data.frame(
  provider = sample(LETTERS[1:4], 1000, T),
  los = round(runif(1000,0,40)),
  age_group = sample(1:4,1000, T))

现在,我们将其转换为数据表。

代码语言:javascript
复制
library(data.table)
setDT(df1)

我们可以像这样扩展你想要的值:

代码语言:javascript
复制
providerlist = c('A','B')
age_list = c(1,2)

df1[provider %in% providerlist & age_group %in% age_list,
  .(los_greater_than7 = 100*sum(los>7)/.N),
  keyby = .(provider, age_group)]
#    provider age_group los_greater_than7
# 1:        A         1          92.40506
# 2:        A         2          81.81818
# 3:        B         1          77.27273
# 4:        B         2          87.50000

df1[provider %in% providerlist & age_group %in% age_list & los>7,
  .(los_greater_than20 = 100*sum(los>20)/.N),
  by = .(provider, age_group)]
#    provider age_group los_greater_than20
# 1:        A         1           56.16438
# 2:        A         2           66.66667
# 3:        B         1           56.86275
# 4:        B         2           58.92857
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49523118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档