2015-12-18 36 views
1

我試圖計算從我的每個25000個觀測值到使用其經度和緯度的50個美國城市的距離。最終,我想獲得每個觀測點到一個主要城市的最小距離,並確定該城市。R在生成變量中用於雙循環

我在這個循環的問題是specifc到 DIST。{$ citygdpcoord城市[J]}在第二循環中,我該如何使它指向由第一回路中生成的dataframes?

for(j in 1:50) 
{ 
    assign(paste("dist",citygdpcoord$city[j],sep="."), 0) 

for(i in 1:25509) 
{ 
    haver <- sin((citygdpcoord$latitude[j]-geofinlit$latitude[i])/2)* 
      sin((citygdpcoord$latitude[j]-geofinlit$latitude[i])/2)+ 
      cos(geofinlit$latitude[i])*cos(citygdpcoord$latitude[j])* 
      sin(citygdpcoord$longitude[j]-geofinlit$longitude[i])*sin(citygdpcoord$longitude[j]-geofinlit$longitude[i]) 
    dist.{citygdpcoord$city[j]}<- data.frame(6371.393*2*atan2(sqrt(haver),sqrt(1-haver))) 

} 
} 
+0

也許你可以解釋你試圖實現的目標 – MLavoie

+0

爲什麼在最後一行有'citygdpcoord $ city [j]'的括號?我以前從來沒有見過這樣的人,所以如果那是真正的語法,請原諒我的無知,但對我來說,它看起來像不恰當的語法。 – brittenb

+1

我想你想要get()函數。比如'get(paste('dist',citygdpcoord $ city [j],sep =「。」))' – Jason

回答

0

好吧,你最大的問題將是該dist.{citygdpcord$city[j]}將被重寫25509次,只有最後一個值將被保存。我建議改變一些事情。首先,使用矩陣並在最後將它們轉換爲數據集。這樣,您可以預先分配對象大小,並且在循環時不會增大對象大小。另外,將你的數據框存儲在一個列表中,這樣你只有一個對象而不是50個。也許像這樣?

dat <- lapply(1:50, function(j) { 
    tmp <- matrix(0, nrow = 25509, ncol = 1) 
    for (i in 1:25509) { 
    haver <- ... # removed code for simplicity 
    tmp[i, ] <- c(6371.393*2*atan2(sqrt(haver), sqrt(1-haver))) 
    } 
    return(as.data.frame(tmp)) 
}) 

然後命名您的列表喜歡names(dat) <- paste("dist",citygdpcoord$city[1:50], sep = ".")

我不知道這是否得到你要完成什麼,但希望它。

+0

謝謝!這正是我想要的。 – pianostout