区域统计计算像素份额并确定 R 中最频繁的 class
Zonal statistic calculating pixel share and determine the most frequent class in R
我已经在这里发布了一个相关问题:,但是这次我想确定在 SpatialPolygonsDataFrame 中不同多边形中权重份额最高的像素-class。 (类似于QGIS插件:zonal statistic > majority)出于我真实数据集中的统计原因,我想将每个多边形末尾的主要class分配给@data插槽。
有一些代码:
set.seed(6)
# Create interger class raster
r <- raster(ncol=36, nrow=18)
r[] <- round(runif(ncell(r),1,10),digits=0)
r[]<-as.integer(r[])
# Create two polygons
cds1 <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20))
cds2 <- rbind(c(80,0), c(50,30), c(60,0), c(60,-25))
polys <- SpatialPolygonsDataFrame(SpatialPolygons(list(Polygons(list(Polygon(cds1)), 1),
Polygons(list(Polygon(cds2)),2))),data.frame(ID=c(1,2)))
# Extract raster values to polygons
v <- extract(r, polys, weights = TRUE)
到目前为止一切都很好,但在进一步的问题中,我只有一个列表元素的值向量,因此可以计算频率并确定具有最高频率的 class 的名称分享。
这次我在列表中有两列:
(list里面的这种数据结构怎么叫?是矩阵还是list index?):
[[1]]
...
[[2]]
value weight
[1,] 10 0.066071429
[2,] 9 0.085714286
[3,] 8 0.098214286
[4,] 4 0.026785714
[5,] 4 0.178571429
[6,] 2 0.098214286
[7,] 3 0.178571429
[8,] 2 0.107142857
[9,] 3 0.137500000
[10,] 3 0.005357143
[11,] 6 0.017857143
我怎样才能 运行 例如 dplyr::group_by()
和 summarise()
。我用 dplyr::summarize_at
尝试了不同的方法,但我对如何处理这种数据类型感到困惑。
您的 v
列表的主要问题是每个条目都是一个 class matrix
对象。因此,您需要将每个列表条目转换为 data.frame
,然后才能使用 dplyr
函数。
library(dplyr)
#Each entry in the list is a matrix object
class(v[[1]])
#[1] "matrix"
#Thus, you need to transform every entry to data.frame
v<-lapply(v, function(x) as.data.frame(x))
#Then set a name for every list entry, in order to use bind_rows
names(v)<-c("1","2")
#use bind_rows
df<-bind_rows(v, .id = "id")
#Get the most frequent class and its frequency
df %>%
group_by(id,value) %>%
count() %>%
ungroup()%>%
group_by(id)%>%
summarize(most_freqclass = value[which(n == max(n))],
max_freq = max(n))
我已经在这里发布了一个相关问题:
有一些代码:
set.seed(6)
# Create interger class raster
r <- raster(ncol=36, nrow=18)
r[] <- round(runif(ncell(r),1,10),digits=0)
r[]<-as.integer(r[])
# Create two polygons
cds1 <- rbind(c(-180,-20), c(-160,5), c(-60, 0), c(-160,-60), c(-180,-20))
cds2 <- rbind(c(80,0), c(50,30), c(60,0), c(60,-25))
polys <- SpatialPolygonsDataFrame(SpatialPolygons(list(Polygons(list(Polygon(cds1)), 1),
Polygons(list(Polygon(cds2)),2))),data.frame(ID=c(1,2)))
# Extract raster values to polygons
v <- extract(r, polys, weights = TRUE)
到目前为止一切都很好,但在进一步的问题中,我只有一个列表元素的值向量,因此可以计算频率并确定具有最高频率的 class 的名称分享。
这次我在列表中有两列: (list里面的这种数据结构怎么叫?是矩阵还是list index?):
[[1]]
...
[[2]]
value weight
[1,] 10 0.066071429
[2,] 9 0.085714286
[3,] 8 0.098214286
[4,] 4 0.026785714
[5,] 4 0.178571429
[6,] 2 0.098214286
[7,] 3 0.178571429
[8,] 2 0.107142857
[9,] 3 0.137500000
[10,] 3 0.005357143
[11,] 6 0.017857143
我怎样才能 运行 例如 dplyr::group_by()
和 summarise()
。我用 dplyr::summarize_at
尝试了不同的方法,但我对如何处理这种数据类型感到困惑。
您的 v
列表的主要问题是每个条目都是一个 class matrix
对象。因此,您需要将每个列表条目转换为 data.frame
,然后才能使用 dplyr
函数。
library(dplyr)
#Each entry in the list is a matrix object
class(v[[1]])
#[1] "matrix"
#Thus, you need to transform every entry to data.frame
v<-lapply(v, function(x) as.data.frame(x))
#Then set a name for every list entry, in order to use bind_rows
names(v)<-c("1","2")
#use bind_rows
df<-bind_rows(v, .id = "id")
#Get the most frequent class and its frequency
df %>%
group_by(id,value) %>%
count() %>%
ungroup()%>%
group_by(id)%>%
summarize(most_freqclass = value[which(n == max(n))],
max_freq = max(n))