【发布时间】:2015-11-18 18:49:18
【问题描述】:
我有一个庞大的数据集,我针对这个问题进行了简化,我尝试将一个函数应用于它的每一行,作为一个特定列的函数。
我尝试了一种 for 循环方法,然后使用 Rprof 和 profvis 进行了一些分析。我知道我可以尝试一些应用或其他方法,但分析似乎表明最慢的部分是由于其他步骤造成的。
这就是我想做的:
library(dplyr)
# Example data frame
id <- rep(c(1:100), each = 5)
ab <- runif(length(id), 0, 1)
char1 <- runif(length(id), 0, 1)
char2 <- runif(length(id), 0, 1)
dat <- data.frame(cbind(id, ab, char1, char2))
dat$result <- NA
# Loop
com <- unique(id)
for (k in com){
dat_k <- filter(dat, id==k) # slowest line
dat_k_dist <- cluster::daisy(dat_k[, c("char1", "char2")], metric = "gower") %>% as.matrix()
num <- apply(dat_k_dist, 2, function(x) sum(x * dat_k[, "ab"]))
denom <- sum(dat_k[, "ab"]) - dat_k[, "ab"]
dat_k[, "result"] <- as.numeric(num / denom)
dat[which(dat$id==k), "result"] <- dat_k$result # 2nd slowest line
}
我的代码中最慢的部分是由于filter 的行,然后当我将获得的结果重新分配到原始数据帧中时。我尝试用subset 或which 替换过滤器功能,但速度更慢。
因此,应该改进这段代码的组织,但我真的不明白如何。
【问题讨论】:
-
dplyr 不是“最快”的库,data.table 是一个更快的库(也比基本切片/切块更快),你可以很好地使用它
标签: r for-loop optimization profiling