为R中的循环加速

为R中的循环加速,r,for-loop,R,For Loop,更新:原来的问题已经解决,现在只剩下georoute循环需要处理 我是一个真正的R初学者,如果这个问题看起来很简单,那么很抱歉。我为循环创建了这个,只是想区分两种类型的数据。在我的五个级别(“DA”“DM”“EA”“PA”“PM”)的数据中有一个引擎类型列,我只想要两个级别(“EA”和其他级别)。这是我的代码 for(i in which(totd$engine_type == "EA")){ totd[i,16]= "EA" } for(i in which(totd$engine_typ

更新:原来的问题已经解决,现在只剩下
georoute
循环需要处理

我是一个真正的R初学者,如果这个问题看起来很简单,那么很抱歉。我为循环创建了这个
,只是想区分两种类型的数据。在我的五个级别(“DA”“DM”“EA”“PA”“PM”)的数据中有一个
引擎类型
列,我只想要两个级别(“EA”和其他级别)。这是我的代码

for(i in which(totd$engine_type == "EA")){
  totd[i,16]= "EA"
}
for(i in which(totd$engine_type != "EA")){
  totd[i,16]= "Non_EA"
}
这很好,但因为我的数据集很大(781225行)所以这需要花费很长时间。我觉得这应该可以通过函数来完成,以加快进程,但我就是找不到办法。我也读过矢量化和其他帖子,但老实说,我不知道如何在这里应用它们。任何提示都将不胜感激

**另外,如果有一种方法可以加速这个循环,那么下面的georoute代码是否也适用?(由于配额限制,我需要多次将其切断)

georoute
需要TaRifxgeo包,您需要从bing map获得免费密钥才能从中获得任何结果**

因此,我的数据具有起点和终点的纬度和经度,如下所示

           latlon          latlon_end  
1 52.481466 13.317647 | 52.518811 13.413034
252.518811 13.413034 | 52.50418213.318051
352.50418213.318051 | 52.502236 13.305396
452.50236 13.305396 | 52.548096 13.355104
5 52.548096 13.355104 | 52.569865 13.410967
652.569865 13.410967 | 52.54505 13.419071


georoute获取的是这两个数据,然后为每对数据生成一个
时间
距离
的列表,这就是未列出和t等的原因。我尝试应用lappy/sapply,但如果一次输入所有数据,它就无法工作。有什么想法吗?

在R中,通常不需要逐行处理,formalae是矢量化的,如果要将函数应用于向量列表中的多个元素,则应使用Lappy或sapply等

如果没有看到您的数据,我无法判断以下内容是否有效,但请尝试

 DT1[250000:281224,]<-tryCatch(t(as.matrix(unlist(georoute( 
   as.character(LL$latlon_end[250000:281224])), verbose=TRUE, 
   returntype=c("time", "distance"))),
   nrow = 1, ncol = 2)),
   error=function(a) {"."} )

DT1[250000:281224,]可以这样创建示例数据帧:

totd <- data.frame(a=rnorm(20), engine_type=sample(c("DA","DM","EA","PA","PM"),20,replace=TRUE))
这样,您就可以对原始数据帧进行子集:

totd[ totd$engine_type == 'EA', ]
…并计算子集的统计信息,例如数字字段“a”:

summary(totd[ totd$engine_type == 'EA', 'a'])

除非我弄错了,否则我认为,
ifelse
可能会更快。例如,如果您创建的新专栏名为
newLevels
,您可以使用
totd$newLevels来填充它。该死,它在5秒钟内就起作用了,我现在发布这个问题感觉像个傻瓜。非常感谢您!!您有没有加快georoute代码的想法?没有我不确定没有看到数据-你能编辑你的问题来发布数据样本吗,以及你希望看到的输出是什么?还有,你是否为georoute函数使用了一个特定的库?我对此不熟悉。是的。我添加了数据并解释了包和其他东西的用法。这在t中有点复杂复制的erms我试图将数据发布到这里,但有点费劲。你的代码是我第一次尝试,但如果我一次输入所有代码,它将不起作用。我真的不知道为什么。我编辑了一些我的旧代码,因为我刚刚意识到第二次输入之前丢失了。希望这现在更像样!
totd[ totd$engine_type == 'EA', ]
summary(totd[ totd$engine_type == 'EA', 'a'])