2016-12-16 7 views
0

私は別の年(2003,2004,2005、r1、r2、r3と言うことができます)から分類されたラスタのセットを持っています。ラスタークラスとその割合は、年数によって異なります。ピクセル数でラスタのリストからのRデータフレーム?

ラスタのリストから1つのデータフレームを作成します。データフレームには、ラスタ(年/ 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) 
関連する問題