我在 Windows10 上运行 R (V3.2.2) 的 RStudio (V 0.99.467) 工作。我有一组来自 ArcGIS 的矢量地图,我使用 rgdal 循环读入 R 以创建类“SpatialPolygonsDataFrame”的对象。
我想在同一个循环中执行几个数据 QAQC 检查和修复。例如,我希望从数据框中的条目中删除空格。我可以在循环外轻松地做到这一点,但在循环内的引用和名称分配方面遇到了困难。在循环之外,此命令删除数据中的所有空格:
# the function I want to apply to each map immediately after I read it
as.data.frame(apply(get(mymap)@data[],2,function(x)gsub('\\s+', '',x)))
此函数也适用于循环,但我无法重新分配新的无空格数据来替换原始数据。这是一些示例代码,以显示我正在尝试做的事情以及我卡在哪里。
# vector of names from map objects
farmnames <- c("Gardner","Mistletoe","Omni","Sturgill")
library(rgdal)
# create vector of filenames based on farmnames
filenames <- paste0(farmnames[],"_Farm_Fields_FINAL")
# loop to read maps and correct data
for (i in 1:length(farmnames)){
name <- farmnames[i]
assign(name, readOGR(".", filenames[i])) # create map object
get(name)@data[]<- as.data.frame(apply(get(name)@data[],2,function(x)gsub('\\s+', '',x))) # remove spaces from map dataframe
}
但是最后一行返回错误:“get(name)@data[] <- as.data.frame(apply(get(name)@data[], 2,: could not find function "get<-" . 我猜我不能把函数放在赋值的左边?因为如果我只输入“get(name)@data[]”,R就会返回正确的答案而不会出错。
我还尝试了各种方法来创建临时数据框,更改临时数据框,然后使用 assign 函数替换地图对象中的数据框。但同样,这适用于循环之外(assign(mymap@data[],d)),而不是循环内(assign(get(name)@data[],d))。
# method 2
d <- as.data.frame(apply(d,2,function(x)gsub('\\s+', '',x)))
assign(get(name)@data[],d)
但是此方法返回错误:“assign(get(name)@data[], d) 中的错误:第一个参数无效”。大概是因为 assign 中的第一个参数应该是单个元素(变量名),而不是数据框?
我还创建了一个子循环来遍历变量名称,逐列进行更正 - 但是当我可以在主循环中使用一行执行所有更正时,这似乎非常低效 - 如果我可以让分配工作。我希望有人有使用我上面粘贴的两个示例中的任何一个的解决方案。
我不确定如何在 StackOverflow 中为 SpatialPolygonsDataFrame 类的对象附加示例原始数据。如果这里没有足够的信息来帮助我,我也许可以在 GitHub 上创建一个公共文件夹并提供一个链接?但我希望这是一个非常基本的分配问题,因为我对 R 和编程仍然很陌生。