全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 数据分析与数据挖掘
839 0
2020-09-16
R中的各种循环。
通常,最好避免R中的循环。但是对于高度独立的任务,矢量化并非总是可能的。因此,如果问题是可分解的,则需要循环。
R中存在哪些不同类型的循环,在哪种情况下使用哪种循环?
在每种编程语言中,都存在for和while循环(有时直到循环)。在R中,这些循环是顺序的而不是那么快。
对于(x中的i)
{任务}
i = y
而(i <= x)
{任务
i = i + 1}
即使是原型制作,有时也会太慢。
但是如何提高速度呢?
R中有三个选项:
应用循环
并行化
RCPP
套用循环:
通常,您可以使用apply计算列,行或两者的一些标准统计量。但是您可以使用技巧来调整循环的应用顺序。语法为:
F <-函数(i,x,y,z,...)
{任务}
apply(as.data.frame(1:length(vector)),margin = 1,FUN = F)
在这种情况下,您不将向量用于直接计算,而是将其用作索引“ i”。
申请订单甚至更快。
F <-函数(i,x,y,z,...)
{任务}
sapply(1:length(vector),FUN = F)
并行化:
您可以使用循环并同时应用订单。你需要:
库(“ doParallel”)
库(“并行”)
库(“ foreach”)
首先定义核数。至少保留以下一项:
NumOfCores <-detectCores()-1
registerDoParallel(NumOfCores)
使用循环:
foreach :: foreach(x = 1:length(vector),.combine = rbind,.inorder = T,.multicombine = F)%多帕%
{任务}
此循环创建结果向量。
如果顺序不重要,则可以通过.inorder = F提高性能。这意味着自由处理器独立于迭代顺序进行下一个迭代。
或使用parSapply顺序:
群集<-makeCluster(NumOfCores)
parSapply(cl =簇,X = 1:长度(向量),FUN = F,x = x,y = y,z = z,...)
在这种情况下,将引用中的数据集成在括号内非常重要–您不能像普通的申请顺序那样直接连接到工作区。
RCPP:
首先,您需要安装RTools。
库(“ Rcpp”)
在C ++中定义一个函数,创建一个共享库并编译代码。
#include <Rcpp.h>
使用命名空间Rcpp;
// [[Rcpp :: export]]
double NameOfFunction(NumericVector矢量)
{任务}
然后可以在R中调用它:
sapply(X = 1:length(testVec),FUN = NameOfFunction,y =向量)
但是什么时候使用哪种循环呢?
从经验来看,我建议根据迭代次数和每次迭代的成本来做出决策。
不贵
昂贵
迭代次数少
for循环,while循环
RCPP,foreach
大量迭代
RCPP,sapply,apply,lapply,for循环,while循环
parSapply,RCPP

关注 CDA人工智能学院 ,回复“录播”获取更多人工智能精选直播视频!


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群