我的目标非常简单,即将1列统计数据添加到shapefile中,以便我可以使用它来为地理区域着色。数据是来自gadm的国家/地区文件。为此我通常在R中使用外包:
library(foreign)
newdbf <- read.dbf("CHN_adm1.dbf") #original shape file
incrdata <- read.csv("CHN_test.csv") #.csv file with same region names column + new data column
mergedbf <- merge(newdbf,incrdata)
write.dbf(mergedbf,"CHN_New")
这几乎可以在所有情况下实现我想要的,但是我在R外部处理的软件之一只能识别.shp文件并且不会读取.dbf(尽管从某种意义上说,这句话显然是轻微的矛盾)。不知道为什么它不会赢。无论如何,基本上它让我需要做与上面相同的事情,但使用shapefile。我认为根据shapefile软件包的说明,该过程应该运行如下:
library(shapefiles)
shaper <- read.shp("CHN_adm1.shp")
simplified <- convert.to.simple(shaper)
simplified <- change.id(simplified,incrdata$DataNew) #DataNew being new column of data from the .csv
simpleAsList <- by(simplified,simplified[,1],function(x)x)
####This is where I hit problems####
backToShape <- convert.to.shapefile(simplified,
data.frame(index=c("20","30","40","50","60","70","80")),"index",5)
write.shapefile(backToShape,"CHN_TestShape")
我担心自己无法绕过形状文件,因为我无法解开它们或以数据框架的方式将它们可视化,因此产生的形状已经被搞砸了当它回到外部图表包时。
要明确:在&#39; backToShape&#39;我只想添加数据列并重新构建shapefile。事实上,我所显示的数据是一个因素,即20,30,40等,但数据可以很容易连续,我确定我不需要输入所有可能性,但这是我似乎唯一能让它被接受的方式。有人可以把我放在正确的轨道上,如果我错过了一个更简单的方法,我也非常感激听到一个建议。非常感谢提前。
答案 0 :(得分:2)
停止使用shapefiles
包。
安装sp
和rgdal
个包。
使用:
读取shapefilechn = readOGR(".","CHN_adm1") # first arg is path, second is shapefile name w/o .shp
现在chn
就像一个数据框。实际上chn@data
是一个数据框。对数据框执行您喜欢的操作但保持相同的顺序,然后您可以使用新数据保存更新的shapefile:
writeOGR(chn, ".", "CHN_new", driver="ESRI Shapefile")
请注意,您不应该直接操纵chn@data
数据框,您可以使用chn
,因为它在很多方面都是数据框,例如chn$foo
获取如果您有人口和区域列,则名为foo
的列或chn$popden = chn$pop/chn$area
会创建一个新的人口密度列。
spplot(chn, "popden")
将按您刚刚创建的popden
列进行映射,并且:
head(as.data.frame(chn))
应该显示shapefile数据的前几行。