Список с выводом из цикла for возвращает пустой - PullRequest
0 голосов
/ 17 сентября 2018

Я написал код для получения результатов перекрестной таблицы растрового стека для разных областей (ограниченных шейп-файлом), охватывающих растр.Тем не менее, я получаю пустой список.

Это функция:

transitions <- function(bound, themat) {    # bound = shapefile # themat = rasterstack
    result = vector("list", nrow(bound))    # empty result list
    names(result) = bound@data$GEOCODIGO

    for (i in 1:nrow(bound)) {    # this is the number of polygons to iterate through
        single <- bound[i,]    # selects a single polygon
        clip <- mask(crop(themat, single), single)    # crops the raster to the polygon boundary

        result[i] <- crosstab(clip, digits = 0, long = FALSE, useNA = FALSE)
        return(result)
    }
}

Я проверил шаги для первого объекта в шейп-файле / ограниченном за пределами цикла for;и это сработало хорошо.Но я все еще не могу понять, почему я получаю пустой список.Есть идеи?

1 Ответ

0 голосов
/ 18 сентября 2018

Пример данных:

p <- shapefile(system.file("external/lux.shp", package="raster"))
b <- brick(raster(p), nl=2)
values(b) = sample(2, 200, replace=TRUE)

фиксированная функция:

transitions <- function(poly, rast) {    
    result = vector("list", nrow(poly))
    for (i in 1:nrow(poly)) {  
        clip <- mask(crop(rast, poly[i,]), poly[i,])   
        result[[i]] <- crosstab(clip, digits = 0, long = FALSE, useNA = FALSE)
    }
    return(result)
}

transitions(p, b)

Альтернативой может быть использование извлечения

e <- extract(b, p)

Для табулирования, как в кросс-таблице:

ee <- lapply(e, function(x) aggregate(data.frame(count=rep(1, nrow(x))), data.frame(x), FUN=sum))

Чтобы понять эту последнюю строку, вам нужно ее распаковать.

class(e)
#[1] "list"
length(e)
#[1] 12
e[[1]]
#     layer.1 layer.2
#[1,]       1       1
#[2,]       1       2
#[3,]       2       2
#[4,]       2       1
#[5,]       2       1
#[6,]       1       2
#[7,]       2       2

e - это список такой же длины, что и количество полигонов (см. length(p))

Давайте сначала скомбинируем первый элемент и получим таблицу с регистрами и счетами.

x <- e[[1]]

aggregate(data.frame(count=rep(1, nrow(x))), data.frame(x), FUN=sum)
#  layer.1 layer.2 count
#1       1       1     1
#2       2       1     2
#3       1       2     2
#4       2       2     2

Аналогичный подход с помощью таблицы (разница в том, что вы можете получить значения Freq, которые равны нулю).

as.data.frame(table(x[,1], x[,2]))
#  Var1 Var2 Freq
#1    1    1    1
#2    2    1    2
#3    1    2    2
#4    2    2    2

Теперь оберните понравившуюся вам функцию в lapply

z <- lapply(e, function(x) aggregate(data.frame(count=rep(1, nrow(x))), data.frame(x), FUN=sum))

И, чтобы продвинуться дальше, свяжите data.frames и добавьте идентификатор, чтобы связать данные сполигоны

y <- do.call(rbind, z,)
y$id <- rep(1:length(z), sapply(z, nrow))

head(y)
#  Var1 Var2 Freq id
#1    1    1    1  1
#2    2    1    2  1
#3    1    2    2  1
#4    2    2    2  1
#5    1    1    1  2
#6    2    1    2  2 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...