我对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变量列表中给出一个年龄组(我似乎无法让它同时作为列表,并使用以下代码输出所有年龄组的所有医院)
Providerage_prob_strand = mapply(LOS_prob_providerage,Provider_unique, agelabels[1], SIMPLIFY = FALSE)然后使用函数使用下面的代码输出的2个列表创建一个数据框架。
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?
发布于 2018-03-27 23:23:16
为此,我将使用data.table包。
一些需要演示的虚拟数据(通常,提问者提供这样的数据是很好的做法):
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))现在,我们将其转换为数据表。
library(data.table)
setDT(df1)我们可以像这样扩展你想要的值:
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.92857https://stackoverflow.com/questions/49523118
复制相似问题