2016-07-06 12 views
1

Rの初心者では、ループのために、そして適用関数にステップを踏み出す時間があると思います。私はこのコードを苦労しており、誰でも手伝ってくれるのだろうかと思っています。ネストされたforループの代わりにApply関数の1つを使用してください。R

私が機能を持っている:

earth.dist <- function (long1, lat1, long2, lat2) 
{ 


rad <- pi/180 
    a1 <- lat1 * rad 
    a2 <- long1 * rad 
    b1 <- lat2 * rad 
    b2 <- long2 * rad 
    dlon <- b2 - a2 
    dlat <- b1 - a1 
    a <- (sin(dlat/2))^2 + cos(a1) * cos(b1) * (sin(dlon/2))^2 
    c <- 2 * atan2(sqrt(a), sqrt(1 - a)) 
    R <- 6378.145 
    d <- R * c 
    return(d) 
} 

は今、私は彼らの長い/緯度を持つ2つの異なるデータセット、所定の大都市とその長い/緯度座標のリストで1とアメリカのランダムな位置を持つものを持っています座標。私が書いたforループは、基本的には、所定の大都市のlong/lat座標に対するランダムな場所の各long/lat座標の差を計算し、最も近い都市が位置する州にランダムな場所を置きます。各都市所定のリストの中にランダムな都市スプレッドシートの新しい列に挿入された状態がある。

適用を使用してこのループを実行する方法はありますか?このループは実際にトリックを行いますが、それはとても長くてかさばりますし、適用関数がより良い仕事をすることができることを私は知っています。ここで

はループです:

for(i in 1:nrow(randomlocations)){ 
    vec<-vector() 
    for(j in 1:nrow(predeterminedcities)){ 
    a<-earth.dist(randomlocations$long[i],randomlocations$lat[i], predeterminedcities$long[j], predeterminedcities$lat[j]) 
    vec[[j]]<-a 
    } 
    ind<- as.numeric(which.min(vec)) 
    randomlocations$state[i]<-as.character(predeterminedcities$STATE[ind]) 
    print(i) 
    } 
+0

'earth.dist'は緯度と経度のベクトルを受け入れます。これが真であれば、あらかじめ決められた都市のベクトル全体を一気に送ります: 'a <-earth.dist(randomlocations $ long [i]、randomlocations $ lat [i]、priorcities $ long、所定の$ lat)'。 – lmo

+0

ありがとう@Imo!どのような行、またはあらかじめ決められた都市、この技術を使っている最短距離がどのようにわかるか知っていますか? – Nechama

+0

ベクトルの出力(ベクトル上で動作している場合)は、あらかじめ設定された都市から発注されるため、それらの位置を使用してその情報を引き出すことができます。多分それが慣れていない場合は、 'which.min'を見てみてください。 – lmo

答えて

1

あなたの関数が既にベクトル化であるので、あなたがデータフレームにインデックスを通過することによって距離行列を計算するためにouterを使用することができます。状態の名前を見つけるためにそれを使用し、その後、最小距離の指標を見つけることmax.colによって、生じるポップ:

#fake test data 
randomlocations <- data.frame(lon=runif(100, -80,-70), lat=runif(100, 45,75)) 
predeterminedcities <- head(randomlocations, 50) 
predeterminedcities$STATE <- state.name 

randomlocations$state <- predeterminedcities[ 
    max.col(- 
    outer(1:nrow(randomlocations), 1:nrow(predeterminedcities), 
     function(i,j) earth.dist(randomlocations$lon[i], randomlocations$lat[i], 
          predeterminedcities$lon[j], predeterminedcities$lat[j]) 
    ) 
), "STATE"] 

変数名を短くした場合、これは簡単に1行に収まりません。

関連する問題