2016-12-16 67 views
0

我有不同年份的分类栅格集(2003,2004,2005,可以说r1,r2,r3)。 Tha光栅类和它们的比例在几年内变化。按像素数从栅格列表中读取R数据帧?

我想从我的栅格列表中创建一个数据框。数据框应包含栅格(year/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

你可以试试这个让你列表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 
2

通过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)