通过像素计数从栅格列表中获取R数据帧?

时间:2016-12-16 19:18:06

标签: r

我有不同年份的分类栅格(2003,2004,2005,比如说r1,r2,r3)。 Tha栅格类及其比例在几年内变化。

我想从我的栅格列表中创建一个数据框。数据框应包含栅格指示(年/ r1 ..),以及每个栅格类的像素数。

我知道我可以通过table(values(r))获得每个类的像素值计数。如何在单个数据框中将每个栅格中的tables放在一起?

示例:

library(raster)

# create raster
r1<-raster(ncol= 3, nrow = 3)
values(r1)<-rep(c(1:3), 3)

#  create more rasters, assign classes
r2<-r1+1
r3<-r1

values(r3)<-c(1,1,1,2,2,2,1,1,1)

# create raster list
r<-list(r1,r2,r3)

# get count of pixel values
table(values(r[[1]]))
table(values(r[[2]]))
table(values(r[[3]]))

# expected to obtain:

raster class count
r1     1     3
r1     2     3
r1     3     3
r2     2     3
r2     3     3
r2     4     3
r3     1     6
r3     2     3

2 个答案:

答案 0 :(得分:3)

通过tidyverse的另一个类似的解决方案:

library(tidyverse)

df <- bind_rows( 
      r1 = as_data_frame(table(values(r[[1]])))
    , r2 = as_data_frame(table(values(r[[2]])))
    , r3 = as_data_frame(table(values(r[[3]])))
    , .id = "raster"
) %>%
# because I assume you want integers instead of strings
mutate( class = as.integer(Var1) ) %>% 
select(raster, class, count = n)

答案 1 :(得分:2)

您可以尝试使用列表r:

获得所需的结果
lst <- lapply(r, function(x) as.data.frame(table(values(x))))
df <- cbind.data.frame(raster=paste0('r', rep(1:length(r), sapply(lst, nrow))), 
                       do.call(rbind, lst))
names(df)[2:3] <- c('class', 'count')
df

   raster class count
1     r1     1     3
2     r1     2     3
3     r1     3     3
4     r2     2     3
5     r2     3     3
6     r2     4     3
7     r3     1     6
8     r3     2     3