R Как применить уравнение к каждой строке из 4 столбцов, где каждый столбец является параметром в уравнении? - PullRequest
0 голосов
/ 10 мая 2018

Ниже приведена матрица 3 * 4, где 2 столбца представляют координаты широты / долготы одного местоположения, а два других - координаты второго местоположения.Я пытаюсь применить формулу расстояния большого круга к каждой строке.Я почти уверен, что должен использовать что-то в семье, но не могу понять, как это сделать.

d=as.data.frame(split(as.data.frame(c( 33.43527 ,-112.01194  ,  37.72139  , -122.22111, -3.78444 , -73.30833 , -12.02667 , -77.12278,37.43555,38.88333,40.97667,28.81528)* pi/180),1:4))
colnames(d)=c('lat','lon','lat2','lon2')

Это уравнение, которое я хотел бы применить к каждой из 3 строк:

sum(acos(sin(lat) * sin(lat2) + cos(lat) * cos(lat2) * cos(lon2 -lon)) * 6371)*0.62137

. Lat, lon, lat2, lon2 представляют имена столбцов в матрице d.,

Окончательный вектор будет выглядеть так:

answer = 645.0978, 626.3632, 591.4725

Любая помощь будет высоко ценится.

Ответы [ 3 ]

0 голосов
/ 10 мая 2018

Вы можете использовать mapply и предоставить все 4 столбцы в качестве параметра функции как:

. Опция может быть записана как:

mapply(function(lat,lon,lat2,lon2)sum(acos(sin(lat) * sin(lat2) +
         cos(lat) * cos(lat2) * cos(lon2 -lon)) * 6371)*0.62137, 
       d[,"lat"],d[,"lon"],d[,"lat2"],d[,"lon2"])

#Result: With updated data
#[1] 645.0978 626.3632 591.4725
0 голосов
/ 10 мая 2018

Функция with позволит вам использовать выражение:

(acos(sin(lat) * sin(lat2) + cos(lat) * cos(lat2) * cos(lon2 -lon)) * 6371)*0.62137 

но вам нужно преобразовать ее d -матрицу в фрейм данных:

 with(data.frame(d), ( acos( sin(lat) * sin(lat2) + 
                             cos(lat) * cos(lat2) * cos(lon2 -lon) ) * 6371) *
                      0.62137
     ) 
[1]  3153.471 10892.893  6324.854

Не следует использовать sum, поскольку функции +, sin, cos и acos все векторизованы, а функция sum - нет. Я попытался изменить отступ, чтобы термины было легче распознать.

0 голосов
/ 10 мая 2018

Мы подставляем столбцы 'd' в [ (как это matrix - для data.frame, $ также может работать), а затем делаем арифметику

(acos(sin(d[,"lat"]) * sin(d[,"lat2"]) + 
    cos(d[,"lat"]) * cos(d[,"lat2"]) * 
   cos(d[,"lon2"] -d[,"lon"])) * r)*0.62137
#[1]  3153.471 10892.893  6324.854

Это также можно сделать в цикле с apply

apply(d, 1, function(x) (acos(sin(x[1]) * sin(x[3]) + 
       cos(x[1]) * cos(x[3]) * cos(x[4] - x[2])) * r)* 0.62137)
#[1]  3153.471 10892.893  6324.854
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...