【发布时间】:2018-01-07 19:24:28
【问题描述】:
我有大约 113 个 geojson 文件,我以前主要在 QGIS 中处理过这些文件。我现在的目标是能够同时将所有文件导入 R 并对附加到每个相应层的基础属性表进行分析。我已经找到了导入一个文件并在转换为数据框后进行任何所需分析的最佳方法。我在文件夹中的文件都如下所示:0cfb16c1-90c2-412d-bb60-2fec34c75e9a.geojson
我用于这一步的代码是:
library(rgdal)
map1 <- readOGR(dsn = "/Users/chris/Documents/GeorgetownMPPMSFS/McCourtMPP/BIGWork/BIGDataFiles/maps/sampled_maps/0cfb16c1-90c2-412d-bb60-2fec34c75e9a.geojson", layer = "0cfb16c1-90c2-412d-bb60-2fec34c75e9a")
summary(map1)
map1 <- as.data.frame(map1)
我想在所有 geojson 文件上运行我在该地图上所做的相同分析,而不必一一进行。我进行的与选举重新划分指标相关的分析包括在此处:
cfbdata$reptotal <- (cfbdata$surveyed_republican_percentage/100)*cfbdata$surveyed_total
cfbdata$demtotal <- (cfbdata$surveyed_democrat_percentage/100)*cfbdata$surveyed_total
cfbdata$NAME <- NULL
aggdata <-aggregate(cfbdata, by=list(cfbdata$cluster),
FUN=sum, na.rm=TRUE)
# Rep district victory is 1 and Dem district victory is 0
aggdata$result <- ifelse(aggdata$reptotal > aggdata$demtotal,1, ifelse(aggdata$demtotal > aggdata$reptotal,0, NA))
EffGapCalc <- subset(aggdata, select=c("cluster","reptotal","demtotal","surveyed_total", "result"))
# Step 1: Calculate Dem Wasted, Rep Wasted, and Net Wasted
EffGapCalc$repwasted <- ifelse(EffGapCalc$result == 1, EffGapCalc$reptotal - (.51*EffGapCalc$surveyed_total), ifelse(EffGapCalc$result == 0, EffGapCalc$reptotal, NA))
EffGapCalc$demwasted <- ifelse(EffGapCalc$result == 0, EffGapCalc$demtotal - (.51 * EffGapCalc$surveyed_total), ifelse(EffGapCalc$result == 1, EffGapCalc$demtotal, NA))
EffGapCalc$netwasted <- abs(EffGapCalc$repwasted - EffGapCalc$demwasted)
# Step 2: Sum Total Wasted Rep and Dem Votes
totrepwasted <- sum(EffGapCalc$repwasted)
totdemwasted <- sum(EffGapCalc$demwasted)
netwaste <- ifelse(totrepwasted>totdemwasted, totrepwasted-totdemwasted, ifelse(totrepwasted<totdemwasted, totdemwasted-totrepwasted))
netwaste
# Democrats had a net waste (more wasted votes) of 74289.6
# Step 3: Divide Net Wasted by Total Number of Votes Case
sum(EffGapCalc$surveyed_total)
totalsurvtot <- sum(EffGapCalc$surveyed_total)
netwaste/totalsurvtot
# Efficiency Gap = .0359 [3.60%]
目标是对所有 113 个 GEOJSON 文件运行相同的分析,并获得 113 个“效率差距”数字的列表,如上面的 .0359。
我在 stackoverflow 和其他地方搜索了许多问题,但没有找到合适的解决方案。虽然我最初认为 for 循环最适合这个,但根据我在其他地方读到的内容,lapply() 实际上可能是更好的选择。我面临的挑战是确保正确导入作为 'lapply()' 的一部分
我尝试使用失败的代码是:
library(rgdal)
fileNames <- list.files(path = "/Users/chris/Documents/GeorgetownMPPMSFS/McCourtMPP/BIGWork/BIGDataFiles/maps/sampled_maps", pattern="*.geojson", full.names = TRUE)
lapply(fileNames, function(x) {
map1 <- readOGR(dsn = x, layer = x)
map1 <- as.data.frame(map1)
out <- map1$reptotal <- (map1$surveyed_republican_percentage/100)*map1$surveyed_total;
map1$demtotal <- (map1$surveyed_democrat_percentage/100)*map1$surveyed_total;
map1$NAME <- NULL;
aggdata <-aggregate(map1, by=list(map1$cluster),
FUN=sum, na.rm=TRUE);
aggdata$result <- ifelse(aggdata$reptotal > aggdata$demtotal,1, ifelse(aggdata$demtotal > aggdata$reptotal,0, NA));
EffGapCalc <- subset(aggdata, select=c("cluster","reptotal","demtotal","surveyed_total", "result"));
# Step 1: Calculate Dem Wasted, Rep Wasted, and Net Wasted
EffGapCalc$repwasted <- ifelse(EffGapCalc$result == 1, EffGapCalc$reptotal - (.51*EffGapCalc$surveyed_total), ifelse(EffGapCalc$result == 0, EffGapCalc$reptotal, NA));
EffGapCalc$demwasted <- ifelse(EffGapCalc$result == 0, EffGapCalc$demtotal - (.51 * EffGapCalc$surveyed_total), ifelse(EffGapCalc$result == 1, EffGapCalc$demtotal, NA));
EffGapCalc$netwasted <- abs(EffGapCalc$repwasted - EffGapCalc$demwasted);
# Step 2: Sum Total Wasted Rep and Dem Votes
totrepwasted <- sum(EffGapCalc$repwasted);
totdemwasted <- sum(EffGapCalc$demwasted);
netwaste <- ifelse(totrepwasted>totdemwasted, totrepwasted-totdemwasted, ifelse(totrepwasted<totdemwasted, totdemwasted-totrepwasted));
netwaste
# Step 3: Divide Net Wasted by Total Number of Votes Case
totalsurvtot <- sum(EffGapCalc$surveyed_total);
netwaste/totalsurvtot;
write.table(out, "/Users/chris/Documents/GeorgetownMPPMSFS/McCourtMPP/BIGWork/BIGDataFiles", sep="\t", quote=F, row.names=F, col.names=T)
})
在这一点上,我已经尝试了两天来解决这个问题,但只会变得更加困惑。任何帮助将不胜感激!
【问题讨论】:
-
你的最后一段代码是如何“失败”的?
-
对不起。我应该澄清这一点。错误消息读取:ogrInfo 中的错误(dsn = dsn,层 = 层,编码 = 编码,use_iconv = use_iconv,:无法打开层调用自:ogrInfo(dsn = dsn,层 = 层,编码 = 编码,use_iconv = use_iconv, swapAxisOrder = swapAxisOrder, require_geomType = require_geomType)
-
简化。从
lapply中的函数中删除所有内容并重新构建它。是第一行readOGR造成的吗?您可以摆脱的无关代码越多越好。而且你应该一边写一边测试,而不是写了 30 行代码然后因为第一个有问题而碰壁。 -
我怀疑它是因为您将 full 文件名传递给
readOGR作为 dsn 和图层参数,并且图层应该只是图层名称。如果不能轻松获取图层名称,请使用 DSN 上的ogrListLayers获取。 -
是的,我在没有其他代码的情况下运行它,它确实是导致问题的 readOGR 代码的第一部分。
标签: r for-loop gis geojson lapply