更新:原来的问题已经解决,现在只剩下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采用的是这两个数据,然后为每对数据生成一个time
和distance
的列表,这是未列出的原因和t等等。我试过应用lapply / sapply但是如果我一次性输入所有数据它就会失败。有什么想法吗?
答案 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) {"."} )