2016-12-16 3 views
0

나는 다른 해 (200320042005, 말할 수있는 r1, r2, r3)의 분류 된 래스터 세트를 가지고있다. 그 래스터 클래스와 그 비율은 수년 내에 다양합니다.픽셀 수로 래스터 목록에서 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)