Преобразовать растровые данные в данные.фрейм

#r #raster #r-raster

#r #растровые #r-растр

Вопрос:

У меня есть несколько растров, и идея состоит в том, чтобы создать столбец для каждого слоя внутри фрейма данных, но я бы хотел использовать mydf$layername mydf[[layername]] операции или в цикле. В моем примере:

 library(raster)
  

Создать пустой фрейм данных:

 mydf<-NULL
  

моделирование в 3 слоя:

 ## Create a simulated RBG rasters
r <- raster(nc=30, nr=30)
r <- setValues(r, round(runif(ncell(r))* 255))
g <- raster(nc=30, nr=30)
g <- setValues(r, round(runif(ncell(r))* 255))
b <- raster(nc=30, nr=30)
b <- setValues(r, round(runif(ncell(r))* 255))
rgb<-stack(r,g,b)
  

Заполнение фрейма данных( mydf ) информацией о каждом слое и использование "names" в качестве имени переменной

 for (i in 1:length(rgb@layers)){
mydf$assign(paste0(rgb[[i]]@layers)) <- as(as.im(rgb[[i]]), "SpatialGridDataFrame")$v
}
Error in mydf$assign(paste0(rgb[[i]]@data@names)) <- as(as.im(rgb[[i]]),  :
  

или

 
for (i in 1:length(rgb@layers)){
     mydf[[assign(paste0(rgb[[i]]@layers))]] <- as(as.im(rgb[[i]]), "SpatialGridDataFrame")$v
}
Error in paste0(rgb[[i]]@layers) : 

  

Есть какое-либо решение для этого mydf$assign(paste0(rgb[[i]]@layers)) или mydf[[assign(paste0(rgb[[i]]@layers))]] операций?

Комментарии:

1. Какие пакеты используются?

2. Почему вы используете assign() здесь? Просто используйте mydf[[rgb[[i]]@data@names]] ( paste0() он ничего не делает).

Ответ №1:

Вы идете по этому очень неправильному пути. Вы не должны использовать @ . Например, вместо rgb@layers использования nlayers(rgb) . Кроме того, вы никогда не должны использовать assign .

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

 library(raster)
rgb <- brick(nc=10, nr=10, nl=3)
set.seed(1)
rgb <- setValues(rgb, round(runif(3 * ncell(r)) * 255))
names(rgb) <- c("R", "G", "B")
  

Вам вообще не нужен этот цикл. Вы можете просто сделать

 v <- as.data.frame(rgb)
head(v)
    R   G   B
1  68 167  68
2  95  90  56
3 146  69 132
4 232 253  69
5  51 162  46
6 229  54 132
  

Или

 v <- data.frame(values(rgb))
  

Вы могли бы сделать это с помощью цикла. Самым простым способом было бы использовать список

 x <- list()
for (i in 1:nlayers(rgb)){
     x[[i]] <- values(rgb[[i]])
}

df <- data.frame(x)
colnames(df) <- names(rgb)