2016-07-30 3 views
0

SpatialPolygonsDataFrame을 데이터와 병합하려고합니다. 일치하는 변수가 있습니다. data.frame은 길이 방향이므로 ISO (즉, 남아프리카 공화국 (ISO : ZAF)에 2002, 2007 및 2013 년 행이 있음)마다 3 개의 항목이 있습니다. taRifx.geosp을 사용해 보았지만 오류가 발생했습니다.SpatialPolygonsDataFrame을 데이터 집합과 병합 할 때의 오류

여기에 taRifx.geo 시도에 대한 코드와 오류가 있습니다. 이 패키지에 대한 merge 문서가 끔찍하기 때문에 이것이 옳다는 것을 확신하지는 않습니다.

elephCountries <- taRifx.geo::merge(SPDF=afCountries, df=elephMapData, by=ISO_A3) 

Error in as.data.frame(x) : argument "x" is missing, with no default 

위의 오류와 혼란은 어디에도 merge 설명서는이 x 인수를 요청하지 않는다는 것입니다. SPDFdf을 묻습니다. 그게 전부 야.

그리고 sp 시도에 대한 코드와 오류는 다음과 같습니다. 여기에 문서가 더 좋지만, 오류에 대한 설명을 어디에서나 찾을 수 없었습니다.

elephCountries <- sp::merge(x=afCountries, y=elephMapData, by="ISO_A3", duplicateGeoms=TRUE) 

Error: nrowBefore == nrowAfter is not TRUE 

나는 이것이 무엇을 의미하는지에 대한 모든 것을 검색하고 그것을 알아낼 수없는 생각했다. 솔직히 두 패키지를 병합하는 데 사용하는 패키지가 마음에 들지 않아 작동하도록하고 싶습니다. 어떤 도움을 주시면 감사하겠습니다. 감사!

편집 : 다음은 병합하려는 파일입니다. 이 코끼리의 불법 살해에 대한 프로젝트이기 때문에

The data file is here.

The map JSON file is here.

나는 단지 아프리카 국가를 부분 집합하고있다. 그래서 여기에 코드입니다 : 내가 위에서 말했듯이

countries <- readOGR("Data/geo-countries-master/data/countries.geojson", "OGRGeoJSON") 

afCountries <- subset(countries, countries$ISO_A3 %in% c(
"AGO", "BDA", "BEN","BWA","BFA","CMR","CAF","TCD","COG","CIV","COD", "COM", 
"DJA", "DZA", "EGY", "ERI", "ETH", "GAB", "GHA", "GIN", "GMB", "GNB", "GNQ", "KEN", 
"LSO", "LBR", "LBY", "MDG", "MRT", "MUS", "MAR", "MWI", "MLI", "SDN", "SSD", 
"MOZ", "NAM", "NER", "NGA", "RWA", "SEN", "SHN", "SLE", "STP", "SOM", "SWZ", "ZAF", "TZA", 
"TGO", "TUN", "UGA", "ZAF", "ZMB", "ZWE")) 

elephMapData <- read.xlsx("Data/elephByCountry_master.xlsx", sheetName = "Sheet1") 

elephCountries <- sp::merge(afCountries, elephMapData, by.x='ISO_A3', by.y='ISO3', duplicateGeoms=TRUE) 

, 나는 sp 패키지와 taRifx.geo 패키지를 모두 병합 시도하고 내가 가진 동일한 오류가있어 모두 (즉, Error: nrowBefore == nrowAfter is not TRUE). 나는 sp::merge 코드를 살펴 봤고 각 파일의 행 수가 일치해야하는 것처럼 보입니다. 그러나 전화가 duplicateGeoms 인 경우에는 문제가되지 않습니다. 여기에 help 그것에 대해 말씀입니다 :이 작업을 수행하는

duplicateGeoms 
logical; if TRUE geometries in x are duplicated if there are multiple matches between records in x and y 
+0

? 다각형에 속성 데이터를 추가하려고합니까? 아니면 단순히 다각형을 더 추가하려고합니까? 공간 데이터와 병합하는 것은 좋은 생각이 아닙니다. rgeos, raster, sp, spatstat, maptools와 같은 실제 공간 패키지의 함수를 사용해야합니다. – Tbar

+0

셰이프 파일과 데이터를 게시 할 수 있습니까? 실제 데이터로 병합을보다 쉽게 ​​보여줄 수 있습니다. – Phil

+0

. @ Tbar, 감사합니다. 예, 속성 데이터를 추가하여 데이터 및지도를 '리플릿'과 함께 사용할 수있게하려고합니다. 또한, 나는 실제로'sp :: merge (...) '와 같은 코드에서 알 수 있듯이 공간 패키지에서 병합 함수를 사용하고 있습니다. @Phil, Github에 내 데이터 및 GEOJSON 파일에 대한 링크를 게시했습니다. – ldlpdx

답변

1

가장 쉬운 방법은 SpatialPolygonsDataFrame 객체의 @data 프레임에 데이터합니다 (.xlsx 파일)에 가입합니다. 이 문제는 국가마다 행이 하나씩 (즉, SpatialPolygonsDataFrame 개체가 설정되는 방법) 예상되지만 각 국가의 데이터는 국가 당 세 행 (매년 하나씩)으로 분산됩니다.

데이터를 공간 데이터와 호환되는 형식으로 변환하는 것이 가장 좋습니다. 이것은 당신에게 당신이 할 수있는 무엇인가를 줄

df <- elephByCountry[, c("region", "subregionid", "country", "ISO2", "ISO3", "cap.lat", "cap.long")] 
df <- unique(df) 

: 나는 데이터 프레임의 사본을 만들고 모든 년에 걸쳐 일정한 열 (국가 이름, 지역, 위도, 경도와 같은 등) 부분 집합으로이 문제를 접근하는 것 일단 준비가되면 공간 데이터로 다시 병합하십시오. 변수가 다른 나머지 변수 각각에 대해 reshape2 패키지를 사용하여 데이터를 깔끔한 형식으로 '캐스팅'합니다.예를 들어 Diff.from.expected 사용 : 그러면 mergedplyr::join()으로 또는 공간적으로 이러한 데이터를 병합 할 수

library("reshape2") 
dfe <- dcast(elephByCountry, ISO3 ~ year, value.var = "Diff.from.expected") 
colnames(dfe) <- c("ISO3", "2002_diff.from.expected", "2007_diff.from.expected", "2013_diff.from.expected") 

.

: 당신은 당신이 (필요에 따라 value.var =를 교체 할) 필요가 변수에 대해이 작업을 수행하고 공간 데이터로이 병합하면

[email protected] <- merge([email protected], dfe, by.x = "ISO_A3", by.y = "ISO3") 

, 당신의 '상수'등을 병합 할 수 있습니다 : 예를 들어 merge() 사용

[email protected] <- merge([email protected], df, by.x = "ISO_A3", by.y = "ISO3") 

여기에서 당신은 당신의 choropleth지도를 그릴 수 있습니다

library("maptools") # needed for plot methods 
plot(countries, asp = 1, col = [email protected]$`2007_diff.from.expected`) 
정확히 당신이 뭘 하려는지
+0

. @ Phil 아주 고마워! 이것은 완벽하게 이해할 수 있습니다. – ldlpdx