Создание растра со значениями PatchStat из SDMTools в R - PullRequest
0 голосов
/ 15 марта 2012

У меня есть растровый файл растительного покрова, который я уменьшил, чтобы он содержал только ячейки древесного покрова. Я использовал clump в растровом пакете, чтобы объединить () смежные области леса. Это дает всем ячейкам, касающимся друг друга, один и тот же идентификатор, поскольку они являются частью одного и того же патча.
Затем я хочу выяснить PatchStat () для каждого скопления, что я делаю, преобразовав свой растр скопления в as.matrix. Я пытался заставить PatchStat () сделать это с растром, но он работал бы только в матрице.

Теперь я хочу создать растр с выводом статистики патча, а именно "perim.area.ratio". Таким образом, каждая ячейка, которая соответствует сгустку 1, получит значение perim.area.ratio, которое соответствует сгустку 1. Для этого я создал data.frame () из своего растра сгустка, который имел: lon, lat, layer(clumpID), cellID.
Я попытался объединить мой растровый файл data.frame с выводом PatchStat, используя layer и patchID . Однако возникает ошибка:

Ошибка в fix.by (by.x, x): «by» должен указывать допустимые столбцы.

Любые идеи, как я мог бы сделать это по-другому, или почему эти столбцы не действительны? Код ниже.

clump <- raster(file.choose())
library(SDMTools)
clumpval <- rasterToPoints(clump)
clumpcell <- cellFromXY(clump, clumpval[, c('x', 'y')] )
clumpdf <- data.frame(clumpval, clumpcell)
ps.data <- PatchStat(as.matrix(clump))
merged.data.all <- merge(clumpdf, ps.data1, by=c("layer", "patchID"))

1 Ответ

2 голосов
/ 15 марта 2012

Как вы его кодировали, функция merge ожидает, что оба фрейма данных будут иметь оба поля 'layer' и столбец 'patchID', тогда как на самом деле вы намереваетесь отобразить слой столбца clumpdf к столбцу patchID файла ps.data. Вам нужно использовать by.x и by.y аргументы.

Правильный вызов будет:

merged.data.all <- merge(clumpdf, ps.data, by.x='layer', by.y="patchID")

Однако есть еще один простой способ назначить ячейкам их скопления perim.area.ratio:

library(raster)
library(SDMTools)

# create a random raster
r <- raster(ncols=200, nrows=200)
r[] <- rbinom(ncell(r), 1, 0.5)

# clump it
rc <- clump(r)

# get patch stats
p <- PatchStat(rc)

# Replace each non-NA value of rc with the corresponding clump perim.area.ratio.
not.na <- Which(!is.na(rc), cells=TRUE)
rc[not.na] <- sapply(rc[not.na], function(x) {
  p[p$patchID==x, 'perim.area.ratio']
})

Чтобы разбить его на вас (в случае, если вы не особенно знакомы с apply функциями), этот последний бит сначала идентифицирует индексы ячеек всех ячеек со значениями не-NA и назначает этот вектор объекту not.na. Затем функция sapply присваивает каждое значение not.na по очереди x и выполняет заполнение между фигурными скобками (которое в этом случае просто возвращает значение perim.area.ratio, найденное в строке p, которая имеет patchID равно x). Функция sapply возвращает вектор этих значений perim.area.ratio, который затем присваивается ячейкам без NA, равным rc. По сути, это операция поиска и замены, при которой номера патчей заменяются соответствующими perim.area.ratios.

Я должен упомянуть, что это может не сработать, если у вас очень большая сетка.

...