2016-11-11 12 views
5
olmalıdır

Hatayı çözemiyorum: İki nokta arasındaki (pist uzunluğu) mesafeyi hesaplamaya çalışırken "vektör için yanlış uzunluk 2 olmalıdır" 2 (pist eşikleri/uçları). İşleri daha da kötüleştirmek için R error: Wrong length for a vector, should be 2 gibi yanıtları anlayamıyorum ve bunları benim durumuma uygulayamıyorum. (pist sonu) pozisyonların bir basitleştirilmiş veri çerçevesi şuna benzer: jeosferin dan distHaversine() işlevini kullanarakgeosphere distHaversine() & dplyr - vektör için yanlış uzunluk hatası, 2

runways <- data.frame(
RWY_ID = c(1,2,3) 
,RWY = c("36R", "36L","01") 
,LAT = c(40.08, 40.12, 40.06) 
,LON = c(116.59, 116.57, 116.62) 
,LAT2 = c(40.05, 40.07,40.09) 
,LON2 = c(116.6, 116.57, 116.61) 
) 

, mesafeyi hesaplamak için deneyin:

runways <- mutate(runways 
       , CTD = distHaversine(c(LON, LAT), c(LON2, LAT2)) 
       ) 

emin değilim neyi Burada yanlış yapıyorum. LON LAT pozisyonunu çıkarırsam, doğru uzunlukta bir sayısal vektördür.

myv <- c(runways$LON[1], runways$LAT[1]) 
myv 

[1] 116.59 40.08 
str(myv) 
num [1:2] 116.6 40.1 
+2

"rowwise" işlevini çalıştırmanız veya tüm satırları bir defada iletmeniz gerekir: "runways%>% rowwise()%>% mutate (CTD = geosphere :: distHaversine (c (LON, LAT), c (LON2, LAT2))) – alistaire

+1

TEŞEKKÜRLER !!! Alistaire ... hayat çok kolay olabilir. Hata mesajını aldığımı varsayalım, sonra vektörize edilmiş yaklaşımın gereken uzunluğu 2'yi aştığını gösterir. – Rainer

cevap

9

Sen rowwise işletmek gerekir, bu nedenle distHaversine tüm satırları yerine tek seferde çiftleri tek dizi geçirilir:

runways %>% rowwise() %>% 
    mutate(CTD = distHaversine(c(LON, LAT), c(LON2, LAT2))) 

## Source: local data frame [3 x 7] 
## Groups: <by row> 
## 
## # A tibble: 3 × 7 
## RWY_ID RWY LAT LON LAT2 LON2  CTD 
## <dbl> <fctr> <dbl> <dbl> <dbl> <dbl> <dbl> 
## 1  1 36R 40.08 116.59 40.05 116.60 3446.540 
## 2  2 36L 40.12 116.57 40.07 116.57 5565.975 
## 3  3  01 40.06 116.62 40.09 116.61 3446.509 

Alternatif distHaversine matrisleri kullanabilir, bunun yerine cbind kullanabilmesi c ait: ölçeğinde

runways %>% mutate(CTD = distHaversine(cbind(LON, LAT), cbind(LON2, LAT2))) 

## RWY_ID RWY LAT LON LAT2 LON2  CTD 
## 1  1 36R 40.08 116.59 40.05 116.60 3446.540 
## 2  2 36L 40.12 116.57 40.07 116.57 5565.975 
## 3  3 01 40.06 116.62 40.09 116.61 3446.509 

, ikinci yaklaşım operat olarak, neredeyse kesinlikle daha iyidir rowwise, vektörizasyondan faydalanmaz ve bu nedenle yavaşlayabilir.

+1

Teşekkürler Alistaire, sana bir bira borcum var. Şimdi çözümü görüyorum, sorduğum için biraz alçakgönüllü hissediyorum. Cbind() aracılığıyla bir matrise geçiş, rox yineleme işlemlerinden biraz daha zariftir. Hala benim için çok şey öğrenmem için R ... :) – Rainer

+1

Endişelenme, bu iyi bir soru. Dplyr'deki bir sütun adına başvurduğunuzda bir işleve ilettiğiniz şeyleri düşünmek, titiz işlevlerdeki hataları önlemek için bu sabit ve hemen saydam olmayan görevlerden biridir. – alistaire

0

Ekleyeceğim bir şey var. Bunun için çok zaman harcadım. Sonunda, ben bu formu dt$variable dplyr içinde kullanmam gerektiğini öğrendim. Bir kez dplyr içinde, doğrudan değişken adını çağırmalısınız.