【发布时间】:2020-03-26 02:39:22
【问题描述】:
我有一个dataframedf,需要应用一个函数来为每一列(calc.fitness)打分:
df
# ch1 ch2 ch3 ch4 ch5 ch6 ch7 ch8
# g1 5 2 7 10 7 10 10 6
# g2 1 4 5 4 1 2 5 4
# g3 16 14 7 4 2 2 8 7
# g4 7 5 5 3 2 5 1 6
# g5 7 2 1 3 7 2 4 1
# g6 4 7 11 4 9 3 9 14
# g7 12 8 6 7 5 9 7 4
# g8 4 2 3 2 2 4 1 1
# g9 1 2 1 1 2 1 2 1
使用sapply,我会得到以下结果,这是正确的,但随着df 的大小增加,会非常耗时:
sapply(as.list(df), calc.fitness,filterTable=my.df)
# ch1 ch2 ch3 ch4 ch5 ch6 ch7 ch8
# 8.481359e-02 6.419552e-01 5.847587e-02 6.713477e-02 1.552056e-01 1.305787e+34 2.805074e-01 2.039931e+00
我使用 [Tag:mclapply` 使其更快,如下所示:
numCores <- detectCores()
result <- unlist(mclapply(1:8, function(x) {
return(calc.fitness(df[,x], filterTable=my.df))}, mc.preschedule = TRUE, mc.cores = numCores))
# result
# [1] 8.481359e-02 8.481359e-02 8.481359e-02 8.481359e-02 1.305787e+34 1.305787e+34 1.305787e+34 1.305787e+34
但结果显示,mclapply 无法正常工作,我不知道是什么问题以及如何解决。非常感谢任何帮助!
PS:calc.fitness 是一个很长的方法,我在这里尝试使它更短:
calc.fitness <- function(df.val, filterTable = my.df) {
input.path <- "/home/Nikki/Desktop/v2017.0/exec/Input_2017.txt"
filterTable$xe <- df.val[1]
filterTable$xth <- df.val[2]
filterTable$xfi <- df.val[3]
filterTable$xfw <- df.val[4]
filterTable$xfm <- df.val[5]
filterTable$xls <- df.val[6]
filterTable$xhls <- df.val[7]
filterTable$xvt <- df.val[8]
filterTable$xvd <- df.val[9]
write.fwf(filterTable,append = TRUE,file = paste("Input_2017", ".txt", sep = ""),width = 25, rownames = F,colnames = F,quote = F)
command <- "wine /home/Nikki/Desktop/v2017.0/exec/2017File.exe"
system(command)
output.file <-read.table("/home/Nikki/Desktop/v2017.0/exec/Output_2017.txt",header = TRUE,fill = TRUE)
output.pgt <- as.numeric(levels(output.file$pgt))[output.file$pgt]
calc.sol <- output.pgt[!is.na(output.pgt)]
opt.sol <- filterTable$PressureDropGL
n <- length(calc.sol)
subtract.val <- calc.sol - opt.sol
denominator <- opt.sol
sq.output <- (subtract.val / denominator) ^ 2
fitness.val <- sum(sq.output) / n
return(fitness.val)
}# end of function
我的.df:
感谢您的帮助。
【问题讨论】:
-
您好 Nikki,如果您提供函数
calc.fitness的代码或它来自的包,会更容易提供帮助。 -
嗨,Ian,calc.fitness 是我编写的一个很长的函数,我试图让它更短且易于理解!我编辑了帖子,你可以看到这个功能!提前非常感谢您!
-
看到你的函数后,你正在将其中生成的数据附加到一个文件中。如果按顺序执行,这可能会很好,但是当您在并行进程中执行此操作时,您一定会遇到麻烦。查看我编辑的评论。
标签: dataframe sapply r parallel-processing data-manipulation sapply mclapply