我有一些必须使用的大型数据框(每个> 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$adherence
和adherence$AH
是实现相同输出的两种方法。
使用full_join
的第一种方式不会运行,显然是因为它将数据框扩展为数十亿行,并且无法将其保存在RAM中。第二个版本运行但它仍在运行(现在大约一周),我需要做很多次。
我一直在研究提高效率的不同方法;使用并行处理不能工作,因为我只能访问服务器上的一个CPU;使用if
切换ifelse
功能。我发现的另一件事(或者我理解的)是,显然数据框lsr
被转换并复制到矩阵中,并在函数期间多次复制粘附数据集的每一行,我有大约6000,如果是这样,这将解释很多长时间的问题。
我一直在以data.frame格式保存我的数据,我应该按照建议here选择其他内容(例如,data.table
)吗?
如果是这样,您会选择在所有其他分析中改变您的数据结构,还是仅仅围绕我已展示的这一部分?
对所有问题感到抱歉,我只想表明我已经考虑了很多。基本上,我只是问:我该怎么做这个功能。我跑得尽可能快?