#r #loops #dataframe #r-raster
#r #циклы #dataframe #r-растр
Вопрос:
У меня есть несколько растров, которые я хотел бы преобразовать в фреймы данных. Я могу делать это вручную один за другим, но это неэффективно. Когда я пытаюсь создать цикл (используя список или вектор с именами), код не работает, и ошибка R гласит: «Ошибка в as.data.frame.default (x[[i]], необязательно = TRUE): не удается принудительно преобразовать класс ‘structure («RasterLayer», package = «raster»)’ в data.frame».
Я пытался сделать это с помощью функции assign(), но она тоже не работает. При использовании вектора имен я могу заставить R создавать фрейм данных только из одного наблюдения, содержащего имя вектора
Когда я делаю это один за другим, R фактически создает то, что я хочу. Мой код для одного растра просто
#"a" is the name of the raster
r_1 <- as.data.frame(a, xy=TRUE, na.rm=TRUE, centroids=TRUE)
Я попробовал несколько способов запустить цикл, но все они потерпели неудачу. Сначала я попытался создать вектор и выполнить цикл с помощью функции assign()
# "a" and "b" are the names of my rasters
o2 <- c("a","b")
for(i in 1:length(o2)){
nam <- substr(o2[i],1,nchar(o2))
assign(nam,as.data.frame(o2[i], xy=TRUE, na.rm=TRUE, centroids=TRUE))
}
Но это создает только фрейм данных с именем a1 с одним наблюдением «a1» и одной переменной.
Я тоже пытался составить список
o4 <- list(a,b)
for(i in 1:length(o4)){
nam <- substr(o4[i],1,nchar(ola4))
r_i <- as.data.frame(o4[i], xy=TRUE, na.rm=TRUE, centroids=TRUE)
}
На этот раз ошибка гласит: «Ошибка в as.data.frame.default (x[[i]], необязательно = TRUE): не удается принудительно преобразовать класс ‘structure («RasterLayer», package = «raster»)’ в data.frame»
Я ожидаю, что у меня будет фрейм данных с тремя столбцами и таким количеством строк, сколько ячеек в моем растре. Столбцы должны содержать широту и долготу центроида каждой ячейки и столбец с информацией о каждой ячейке. Я не вижу никакой ошибки в своем коде, может быть, кто-нибудь сможет мне помочь.
Я сам создал растры, используя разные шейп-файлы. У меня есть более 40 растров со следующими характеристиками: длина 8806, высота: 10389, происхождение: -77.6699, 4.94778, размер пикселя: 0,001041666, SRC: EPSG: 4326 — WGS 84 — Географический. Как я уже сказал, я сам создал растры, и все они имеют те же характеристики.
Комментарии:
1. Не могли бы вы также поделиться своими данными?
2. Я сам создал растры, используя разные шейп-файлы. У меня есть более 40 растров со следующими характеристиками: длина 8806, высота: 10389, происхождение: -77.6699, 4.94778, размер пикселя: 0,001041666, SRC: EPSG: 4326 — WGS 84 — Географический. Как я уже сказал, я сам создал растры, и все они имеют те же характеристики.
Ответ №1:
Задавая подобный вопрос, всегда указывайте некоторые примеры данных (обычно не ваши данные). Здесь используются три (идентичных) растровых файла
f <- system.file("external/test.grd", package="raster")
ff <- c(f,f,f)
Теперь используйте списки, чтобы выполнить то, что вы хотите.
r <- lapply(ff, raster)
x <- lapply(r, function(i) as.data.frame(i, xy=TRUE, na.rm=TRUE))
Никогда не используйте assign
Ответ №2:
Вместо цикла вы можете использовать apply
:
s=c(raster1,raster2,raster3)
lapply(s, as.data.frame)