删除了我以前的问题,因为我意识到这是问题的症结所在。我正在使用R中的siland软件包来创建最佳缓冲区大小,其中影响最大的是我所拥有的7个陆地覆盖变量中的每个观测点。这些土地覆盖变量是在QGIS中以多边形的形式手工创建的,然后在导出供在R中使用之前,合并成一个单层(脚本:试用-2)。我的问题是,当我将数据读取到R中时,我的多边形类型(例如农业、人为)被认为是因子“层”的层次,而不是自身的因素。我需要农业土地覆盖作为一个因素,这样我就可以计算出缓冲区中有多少区域,而不是用来分配一个多边形是否属于某种类型的非。任何帮助,在这方面做什么,将是超级感谢!
shapedata=st_read(dsn = "R/GIS transfer/", layer = "Trial-2", stringsAsFactors = T)
#Simple feature collection with 7 features and 1 field
#Geometry type: MULTIPOLYGON
#Dimension: XY
#Bounding box: xmin: 442227.6 ymin: 5424196 xmax: 446567.3 ymax: 5428756
#Projected CRS: ETRS89 / UTM zone 32N
str(shapedata)
#Classes ‘sf’ and 'data.frame': 7 obs. of 2 variables:
#$ layer : Factor w/ 7 levels "Agri T","Anthro T",..: 1 2 3 4 5 6 7
#$ geometry:sfc_MULTIPOLYGON of length 7; first list element: List of 195编辑:我跟随着siland vignette -它的最终产品是创建一个缓冲区,其中变量与观测最相关(例如,259米用于农业土地覆盖,23m用于人类学等) (https://cran.r-project.org/web/packages/siland/vignettes/siland.html)。
我的代码是:
shapedata=st_read(dsn = "R/GIS transfer/", layer = "Trial-2",)
#Simple feature collection with 7 features and 1 field
#Geometry type: MULTIPOLYGON
trapdata<-read.table("Trap-Data-PA.csv",header=T,sep=",")
> str(shapedata)
#Classes ‘sf’ and 'data.frame': 7 obs. of 2 variables:
#$ layer : Factor w/ 7 levels "Agri T","Anthro T",..: 1 2 3 4 5 6 7
#$ geometry:sfc_MULTIPOLYGON of length 7; first list element: List of 195下一步是绘制,我成功地为每个级别的多边形创建了一个对象。
Agri=st_geometry(shapedata[shapedata$layer == "Agri T",]) #extract an sf object with only polygons of type Agri T
Anthro=st_geometry(shapedata[shapedata$layer == "Anthro T",]) #extract an sf object with only polygons of type Anthro T
p<-ggplot(shapedata)+
geom_sf(data=Agri,fill="red")+
geom_sf(data=Anthro,fill="blue")+
geom_point(data=trapdata, aes(x,y),col="green")
p + coord_sf(xlim = c(8.228361,8.249213), ylim = c(48.99159,48.99941))然而,让我感到震惊的是将我的数据输入到siland函数本身:
resB1=Bsiland(obs~x1+L1+L2,land=shapedata,data=trapdata)#bisiland我没有L1或L2的等价物,它们都是用于土地覆盖的变量。您可以在它们的str(shapedata)中看到它们具有:
str(landSiland)
## Classes 'sf' and 'data.frame': 4884 obs. of 3 variables:
## $ L1 : num 0 0 0 0 0 0 0 0 0 0 ...
## $ L2 : num 0 1 0 0 0 0 0 0 1 0 ...
## $ geometry:sfc_MULTIPOLYGON of length 4884; first list element: List of 1我的变量似乎没有以相同的方式被视为类,这很可能是为什么当我试图将变量输入到bsiland函数时,它返回以下错误消息:“数据参数中没有用于观察的逗号X和Y”
发布于 2022-03-23 21:13:39
现在我明白了问题所在。显然,siland包预计陆地覆盖多边形将是“一个热编码”。这意味着,需要对数据进行预处理,而不是像通常那样只处理一个土地覆盖类列,以便有多个列,每个陆地覆盖层有一列,每一列包含1或0的值,其中1表示特征属于该土地覆盖层,0表示不是该陆盖层。
实现这一目的的方法之一是在dummyVars包中使用caret函数。下面是它的工作原理:
library(sf)
library(caret)
library(siland)
landcover <- st_read("landcover.shp")
# Remove geometry
landcover_df <- st_drop_geometry(landcover)
# Prepare one hot encoded data.frame
landcover_onehot <- dummyVars("~.", data=landcover_df)
landcover_encoded <- data.frame(predict(landcover_onehot, newdata = landcover_df))
str(landcover_encoded)
# Join back to original
landcover <- do.call(cbind, list(landcover, landcover_encoded))
str(landcover)希望这能帮助你重回正轨。
https://stackoverflow.com/questions/71574762
复制相似问题