1

希望我把所有东西都放在一起解决这个问题。对我来说是第一次,描述起来有点棘手。

我想向 dbf 文件添加一些属性,然后将其保存以在 qgis 中使用。其关于选举和数据是来自11个政党的绝对值和相对值的投票。我为此使用了 shapefiles 包,但也简单地使用了外文进行了尝试。

我的系统:RStudio 0.97.311、R 2.15.2、shapefile 0.7、外国 0.8-52、ubuntu 12.04

尝试#1 => 没问题

shpDistricts <- read.shapefile(filename)
shpDataDistricts <- shpDistricts$dbf[[1]]
shpDataDistricts <- shpDataDistricts[, -c(3, 4, 5)] # delete some columns
shpDistricts$dbf[[1]] <- shpDataDistricts
write.shapefile(shpDistricts, filename))

尝试#2 =>“get 中的错误(“write.dbf”,“package:foreign”)(dbf$dbf,out.name):无法处理矩阵/数组列”

shpDistricts <- read.shapefile(filename)
shpDataDistricts <- shpDistricts$dbf[[1]]
shpDataDistricts <- shpDataDistricts[, -c(3, 4, 5)] # delete some columns
shpDataDistricts <- cbind(shpDataDistricts, votesDistrict[, 2]) # add a new column
names(shpDataDistricts)[5] <- "SPOE"
shpDistricts$dbf[[1]] <- shpDataDistricts
write.shapefile(shpDistricts, filename))

写入函数返回“get("write.dbf", "package:foreign")(dbf$dbf, out.name) 中的错误:无法处理矩阵/数组列”

因此,只需向 data.frame 添加一列(整数),write.dbf 函数就无法再写出。我现在在这个简单的问题上调试了 3 个小时。通过打开 shapefile 和 dbf 文件尝试使用 shapefiles 包,一直都是同样的问题。

当我直接使用外部包时(read.dbf)。

如果我在没有投票数据的情况下保存 dbf 文件(仅使用步骤 1+2 中的小调整),那没问题。它必须与与投票数据的合并有关。

4

2 回答 2

1

在使用 rgdal 处理 R 中的 shapefile 时,我收到了相同的错误消息(“get("write.dbf"...) 中的错误。我在 shapefile 中添加了一个列,然后尝试保存输出并得到错误。我将该列作为数据框添加到 shapefile 中,当我通过 as.factor() 将其转换为因子时,错误消失了

shapefile$column <- as.factor(additional.column)

writePolyShape(形状文件,文件名)

于 2013-05-07T16:40:46.910 回答
1

问题是 write.dbf 无法将数据框写入属性表。所以我尝试将其更改为字符数据

我最初的错误代码是:

d1<-data.frame(as.character(data1))
colnames(d1)<-c("county") #using rbind should give them same column name
d2<-data.frame(as.character(data2))
colnames(d2)<-c("county")
county<-rbind(d1,d2)
dbfdata$county <- county
write.dbf(dbfdata, "PANY_animals_84.dbf") **##doesn't work** 
##Error in write.dbf(dataname, ".bdf")cannot handle matrix/array columns

然后我将所有内容都更改为字符,它起作用了!正确的代码是:

d1<-as.character(data1)
d2<-as.character(data2)
county<-c(d1,d2)
dbfdata$county <- county
write.dbf(dbfdata, "filename")

希望能帮助到你!

于 2015-07-08T01:32:41.227 回答