为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.413034252.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'])