加速R

时间:2016-09-16 15:19:49

标签: r for-loop

更新:原来的问题已经解决,现在只剩下georoute循环了。

我是R的真正初学者,很抱歉,如果这个问题看起来很简单。我创建此for loop只是想区分两种类型的数据。在我的五个级别的数据中有一个engine_type列(" DA"" DM"" EA"" PA" PM&# 34;),我只想要两个级别(" 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行),所以它需要永远这样做。我觉得这应该能够通过功能来加快这个过程,但我找不到办法。我也读过有关矢量化和其他帖子但老实说我不知道​​如何在这里应用它们。任何提示将非常感谢!!

** PS。如果有办法加快这个循环,那么这也适用于我的georoute代码在下面吗? (由于配额限制,我需要多次切断它)

georoute需要TaRifxgeo包,您需要从bing map获取免费密钥才能获得任何结果..来自here **

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

所以我的数据具有原点和目的地的纬度和经度,如下所示。

           latlon          latlon_end  

1 52.481466 13.317647 | 52.518811 13.413034
2 52.518811 13.413034 | 52.504182 13.318051
3 52.504182 13.318051 | 52.502236 13.305396
4 52.502236 13.305396 | 52.548096 13.355104
5 52.548096 13.355104 | 52.569865 13.410967
6 52.569865 13.410967 | 52.54505 13.419071

georoute采用的是这两个数据,然后为每对数据生成一个timedistance的列表,这是未列出的原因和t等等。我试过应用lapply / sapply但是如果我一次性输入所有数据它就会失败。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

可能会创建一个示例数据框:

totd <- data.frame(a=rnorm(20), engine_type=sample(c("DA","DM","EA","PA","PM"),20,replace=TRUE))

你可以得到一个布尔值向量,表明该行是否有引擎类型'EA':

totd$engine_type == 'EA'

通过它,您可以对原始数据框进行子集化:

totd[ totd$engine_type == 'EA', ]

...并计算子集的统计数据,例如数字字段'a':

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

答案 1 :(得分:0)

在R中,您通常不需要逐行处理,formualae是矢量化的,并且您希望将函数应用于矢量列表的几个元素,您应该使用lapply或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) {"."} )