问题描述
我有大约20个shapefile的列表,我想将它们绑定到一个文件中。这些shapefile具有不同数量的字段-一些具有1,一些具有2。示例如下所示:
# 1 field
> dput(head(shp[[1]]))
structure(list(area = c(1.60254096388,1.40740270051,0.093933438653,0.609245720277,22.892748868,0.0468096597394)),row.names = 0:5,class = "data.frame")
# 2 fields
> dput(head(shp[[3]]))
structure(list(per = c(61,70,79,90,57,66),area = c(2218.8,876.414,2046.94,1180.21,1779.12,122.668)),row.names = c(0:5),class = "data.frame")
我使用以下代码将它们绑定起来,并且按我的意愿工作:
merged<- raster::bind(shp,keepnames= FALSE,variables = area)
writeOGR(merged,'./shp',layer= 'area',driver="ESRI Shapefile")
但是,我现在需要对列表中的shapefile之一进行子集化。我是这样做的:
shp[[3]]@data <- shp[[3]]@data %>% subset(Area >= 50)
names(shp[[3]]@data)[names(shp[[3]]@data) == "Area"] <- "area"
但是,当我运行bind
命令时,这会给我一个错误:
merged<- raster::bind(shp,variables = area)
Error in `.rowNamesDF<-`(x,value = value) : invalid 'row.names' length
Calls: <Anonymous> ... row.names<- -> row.names<-.data.frame -> .rowNamesDF<-
Execution halted
我不确定为什么会这样。 shapefile尚未更改,它们只是子集。我尝试按照以下所示的方式删除行名,但仍会引发相同的错误。
rownames(shp[[3]]@data) <- NULL
那会是什么?
解决方法
我认为问题在于您为@data
(属性)设置了子集,但应该对整个对象进行设置。像这样
x <- shp[[3]] # for simplicity
x <- x[x$Area >= 50,]
names(x)[names(x) == "Area"] <- "area"
shp[[3]] <- x