加快应用UDF和R

时间:2017-11-22 09:00:20

标签: r performance function apply

我有一些必须使用的大型数据框(每个> 100GB)。我需要像这样的输出(adherence$adherence):

 adherence <- cbind.data.frame(c("1", "2", "3", "1", "2", "3"), c("2013.1", "2013.1", "2013.1", "2013.2", "2013.2", "2013.2"))
library(dplyr)
library(tidyr)
names(adherence)[1] <- "ID" 
names(adherence)[2] <- "year"
adherence$year <- as.numeric(as.character(adherence$year))

lsr <- cbind.data.frame(
  c("1", "1", "1", "2", "2", "2", "3", "3"), #ID
  c("2012.3", "2012.8", "2013.1","2012.8", "2013.3", "2013.9", "2011", "2013"), #eksd
  c("60", "90", "90", "60", "120", "60", "30", "90") # DDD
)
names(lsr)[1] <- "ID"
names(lsr)[2] <- "eksd"
names(lsr)[3] <- "DDD"

lsr$eksd <- as.numeric(as.character(lsr$eksd))
lsr$DDD <- as.numeric(as.character(lsr$DDD))
lsr$ENDDATE <- lsr$eksd + lsr$DDD/365.25


adherence <- adherence %>% full_join(lsr, by = 'ID')  %>% mutate(newVariable = ifelse(eksd <= year & year <= ENDDATE, (ENDDATE - year) * 365.25, 0)) %>% 
  group_by(ID, year) %>% summarize(newVariable = sum(newVariable)) 

function.AH <- function(x) {
  A <- subset(lsr, ID == x[1] & eksd <= x[2] & ENDDATE > x[2]) 
  ifelse(nrow(A) == 0, 0, sum(A$ENDDATE-as.numeric(x[2]))*365.25)
   }

adherence$AH <-apply (adherence, 1,  FUN = function.AH)

Adherence$adherenceadherence$AH是实现相同输出的两种方法。 使用full_join的第一种方式不会运行,显然是因为它将数据框扩展为数十亿行,并且无法将其保存在RAM中。第二个版本运行但它仍在运行(现在大约一周),我需要做很多次。

我一直在研究提高效率的不同方法;使用并行处理不能工作,因为我只能访问服务器上的一个CPU;使用if切换ifelse功能。我发现的另一件事(或者我理解的)是,显然数据框lsr被转换并复制到矩阵中,并在函数期间多次复制粘附数据集的每一行,我有大约6000,如果是这样,这将解释很多长时间的问题。

我一直在以data.frame格式保存我的数据,我应该按照建议here选择其他内容(例如,data.table)吗?

如果是这样,您会选择在所有其他分析中改变您的数据结构,还是仅仅围绕我已展示的这一部分?

对所有问题感到抱歉,我只想表明我已经考虑了很多。基本上,我只是问:我该怎么做这个功能。我跑得尽可能快?

0 个答案:

没有答案