цикл или функция Саппли для множественного анализа наименьших затрат в R - PullRequest
1 голос
/ 14 ноября 2011

Я использую пакет gdistance для анализа наименьших затрат.Идея состоит в том, чтобы определить путь от точки назначения к источнику через сетку затрат (растр) с определенными значениями стоимости;путь, таким образом, избегает пикселей с высокой стоимостью и предпочитает пиксели с низкой стоимостью.Код, который работает для меня с моими данными:

Costpath<-shortestPath(CostTrans,Cherangfirstloc.utm[1,],Cherangfirstloc.utm[132,], output="SpatialLines")

Таким образом, CostTrans составляет сетку затрат, Cherangfirstloc.utm[1,] - это первое местоположение / точка из фрейма данных Spatialpoints (источник), а Cherangfirstloc.utm[132,] - этопоследнее местоположение / точка из кадра данных пространственных точек (пункт назначения).Выходными данными является линия, соединяющая оба местоположения / точки.

Однако теперь я хочу вычислить несколько путей наименьшей стоимости , поэтому источником должен быть каждая строка датафрейм, пункт назначения остается прежним.Это означает, что следующим источником будет Cherangfirstloc.utm[2,], затем Cherangfirstloc.utm[3,] и так далее.Я думаю, что это можно сделать с помощью цикла for или, возможно, функции sapply.К сожалению, я не знаю, как это сформулировать.

Не могли бы вы дать мне какие-нибудь советы о том, как сформулировать этот итеративный процесс? Надеюсь, это нормально, если я задам этот вопрос в этом месте.По сути, я просто хочу знать, как перебирать данные.Как работает gdistance и анализ наименьших затрат, поэтому неважно.

Вот пример кода, который можно использовать в качестве примера данных:

library(gdistance)

r <- raster(nrows=6, ncols=7, xmn=0, xmx=7, ymn=0, ymx=6, crs="+proj=utm 
+units=m")

r[] <- c(2, 2, 1, 1, 5, 5, 5, #creates costgrid
 2, 2, 8, 8, 5, 2, 1,
 7, 1, 1, 8, 2, 2, 2,
 8, 7, 8, 8, 8, 8, 5,
 8, 8, 1, 1, 5, 3, 9,
 8, 1, 1, 2, 5, 3, 9)

T <- transition(r, function(x) 1/mean(x), 8) #creates transition layer of costgrid
T <- geoCorrection(T) #correction

c1 <- c(5.5,1.5) #first source point
c2 <- c(5.5,4) #second source point
c3 <- c(1.5,5.5) #destination

sPath2 <- shortestPath(T, c1, c3, output="SpatialLines") # creates the least cost path

К сожалению, я не знал, как включить c1,c2 и c3 в кадре данных Spatialpoints, чтобы можно было выполнить итерацию.Надеюсь, что это все еще помогает.

Буду признателен, если вы дадите мне какие-нибудь намеки на это.Спасибо за ваши старания!

1 Ответ

1 голос
/ 15 ноября 2011

Если вы просто хотите вызвать функцию shortestPath с переменным аргументом, самое простое решение - использовать цикл for, как показано ниже.Так как я не знаком с этим видом анализа, я не знаю, что вы хотите сделать с результатами, поэтому вот два решения:

В этом примере вы будете использовать кратчайший путь немедленно, так какбудет забыт на следующем шаге:

for(i in 1:nrow(Cherangfirstloc.utm)) {
  # Computation
  Costpath <- shortestPath(CostTrans, Cherangfirstloc.utm[i,], Cherangfirstloc.utm[132,], output="SpatialLines") 

  ### Here your instructions for a direct use of the result ###
}

В этом случае все пути будут сохранены в списке (кажется, что функция shortestPath возвращает объект, так что это более удобный способ хранения)каждый результат будет доступен в переменной results, например results[[12]] для пути, начинающегося в 12-й строке:

results = list()
for(i in 1:nrow(Cherangfirstloc.utm)) {
  # Computation, storage in a list element
  results[[i]] <- shortestPath(CostTrans, Cherangfirstloc.utm[i,], Cherangfirstloc.utm[132,], output="SpatialLines") 
}

### Here your instructions for a global use of the result ###
...