如何用r中的sapply替换三重循环

时间:2018-02-15 23:43:52

标签: r loops sapply

我读了很多关于sapply和嵌套循环的帖子。所有帖子都解决了像

这样的情况
for(i in 1:10){
  for(j in 1:10){
    for(k in 1:10){

我的问题是如何解决像

这样的情况
for(i in 1:10){
  ...
  for(j in 1:10){
     ...
     for(k in 1:10){
        ...

这是我的例子:

di<-vector("list",length(rotte_merge2))
od<-vector("list",length(rotte_merge2))
for(i in 1:length(rotte_merge2)){ 
  a<-rotte_merge2[[i]]
  rotte_<-split(a, a$callsign)
  dist_in_km<-matrix(ncol=1, nrow =length(rotte_))
  dist_OD<-matrix(ncol=1, nrow =length(rotte_))
  for(j in 1:length(rotte_)){  
    c<-rotte_[j] 
    c<-data.frame(c)
    colnames(c)<-c("time","lat","lon","callsign","OR","DE","ICAOType","merge","count")
    g<-length(c$lat)
    c<-c[order(c$time),]
    plot(c$lat,c$lon)
      d <- sapply(2:(nrow(c)-1), function(x) distGeo(cbind(c$lon[x],c$lat[x]),cbind(c$lon[x-1],c$lat[x-1]))/1000);
      d[1]<- distGeo(cbind(c$lon[g-1], c$lat[g-1]),cbind(c$lon[1], c$lat[1]))/1000
      d[2]<-distGeo(cbind(c$lon[2], c$lat[2]),cbind(c$lon[g], c$lat[g]))/1000
    max_dist<-which.max(d)
    dist_in_km[j,1]<-d[max_dist] 
    dist_OD[j,1]<-distGeo(cbind(c$lon[length(c$lat)], c$lat[length(c$lat)]),cbind(c$lon[1], c$lat[1]))/1000 
  }
  di[[i]]<-dist_in_km
  od[[i]]<-dist_OD
  print(i)
  flush.console()
}

其中rotte_merge2是矩阵列表。

非常感谢。

EDIT 在我的例子中,我有一个矩阵列表。矩阵是坐标的集合。第一步是列表中的分割矩阵,我想计算每个列表中一个点与其后继者之间的距离。 因此,第一个循环是按矩阵滚动,第二个循环是按列表滚动(通过拆分矩阵创建),最后一个循环是按每个坐标滚动。

matrices(rotte_merge2)就像

 time      lat           lon       callsign OR   DE ICAOType     merge
1504252229 50.84889   4.359764500   ICE554 BIKF EBBR     B752 BIKF EBBR
1504252244 63.99482 -22.623094412   ICE554 BIKF EBBR     B752 BIKF EBBR
1504252259 63.99482 -22.622935955   ICE554 BIKF EBBR     B752 BIKF EBBR
1504252274 63.99482 -22.622883136   ICE554 BIKF EBBR     B752 BIKF EBBR
1504252289 63.99482 -22.622883136   ICE554 BIKF EBBR     B752 BIKF EBBR
1504252304 63.99482 -22.622883136   ICE554 BIKF EBBR     B752 BIKF EBBR
1504252319 63.99482 -22.622883136   ICE554 BIKF EBBR     B752 BIKF EBBR
1504252334 63.99482 -22.622883136   ICE554 BIKF EBBR     B752 BIKF EBBR
1504252349 63.99429 -22.620437622   ICE554 BIKF EBBR     B752 BIKF EBBR
1504256579 53.58838   0.2505852     WOW462 BIKF EBBR     A321 BIKF EBBR
1504256594 53.57529   0.2985927     WOW462 BIKF EBBR     A321 BIKF EBBR
1504256609 53.56174   0.3477958     WOW462 BIKF EBBR     A321 BIKF EBBR
1504256624 53.54768   0.3973912     WOW462 BIKF EBBR     A321 BIKF EBBR
1504256639 53.53391   0.4438477     WOW462 BIKF EBBR     A321 BIKF EBBR
1504256654 53.51857   0.4946202     WOW462 BIKF EBBR     A321 BIKF EBBR
1504256669 53.50456   0.5407628     WOW462 BIKF EBBR     A321 BIKF EBBR
1504256684 53.49006   0.5888187     WOW462 BIKF EBBR     A321 BIKF EBBR

列表通过callign分割矩阵(在本例中为2个列表)

0 个答案:

没有答案