#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)