2016-12-16 104 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)