R несколько значений на многоугольник Choroplethr

У меня возникла следующая проблема, и я не знаю, как действовать:

Я хочу сделать тепловую карту с данными о немецких ветряных электростанциях. Поэтому я использую один шейп-файл, отображающий все немецкие почтовые индексы (отлично работает).

Второй блок данных содержит все недавно установленные ветряные электростанции в Германии. Я хотел бы показать, в каком районе ЗИП наибольшая установленная мощность с течением времени.

Когда я пытаюсь сделать это в пакете choroplethr, я сталкиваюсь с проблемой, что во фрейме данных с электростанциями около 1000000 строк, поэтому несколько почтовых индексов дублируются (многие почтовые индексы содержат более одной ветряной электростанции. ...).

Из-за этого я получаю следующее сообщение об ошибке:

anyDuplicated(self$user.df$region) == 0 is not TRUE

Вот код. Он основан на следующем примере: https://www.r-bloggers.com/case-study-mapping-german-zip-codes-in-r/

library(sf)
library(choroplethr)
library(dplyr)
library(ggplot2)
library(rgdal)
library(maptools)
library(gpclib)
library(readr)
library(R6)

ger_plz <- readOGR(dsn = ".", layer = "plz-5stellig")
ger_plz2 <- read_sf("...plz-5stellig.shp")

ger_plz@data$id <- rownames(ger_plz@data)
ger_plz.point <- fortify(ger_plz, region="id")
ger_plz.df <- inner_join(ger_plz.point,ger_plz@data, by="id")

BNETZAVZ <-read.csv2("WindPower DATA.csv", 
                      header = TRUE, sep = ";", dec = ",")
BNETZAVZ_k <- subset(BNETZAVZ, inst_leistung >= 100 & energietraeger >= "7" & energietraeger<="8" & stat_Relevanz=="1",
                     select=c(anlagenschl, plz, inst_leistung, spannungsebene, inbetriebnahme, ausserbetriebnahme, regelzone_name, energietraeger))
#BNETZAVZ_k$inbetriebnahme <- dmy_hms(as.character(BNETZAVZ$inbetriebnahme))
print(BNETZAVZ_k$plz)
# Datum funktioniert so::)
BNETZAVZ_k$inbetriebnahme <- as.Date(BNETZAVZ_k$inbetriebnahme, format = "%d.%m.%Y %H:%M:%S")
BNETZAVZ_k2000 <- subset(BNETZAVZ_k, inbetriebnahme >="2000-01-01")

# variable name 'region' is needed for choroplethr
ger_plz.df$region <- ger_plz.df$plz
#subclass choroplethr to make a class for your my need
GERPLZChoropleth <- R6Class("GERPLZChoropleth",
                            inherit = choroplethr:::Choropleth,
                            public = list(
                              initialize = function(user.df) {
                                super$initialize(ger_plz.df, user.df)
                              }
                            )
)
#choropleth needs these two columnames - 'region' and 'value'
colnames(BNETZAVZ_k2000) [1] <- "EEG-key"
colnames(BNETZAVZ_k2000) [2] <- "region"
colnames(BNETZAVZ_k2000)[3] <- "value"
BNA <- data.frame(BNETZAVZ_k2000$region, BNETZAVZ_k2000$value)
colnames(BNA) = c("region", "value")
#instantiate new class with data
c <- GERPLZChoropleth$new(BNA)

# СООБЩЕНИЕ ОБ ОШИБКЕ ОТОБРАЖАЕТСЯ В СТРОКЕ ВЫШЕ ...

 #plot the data
    c$ggplot_polygon = geom_polygon(aes(fill = value), color = NA)
    c$title = "Capacity Windkraft BNETZA"
    c$legend= "Capacity per Zipcode"
    c$set_num_colors(9)
    c$render()

person Ferdinand    schedule 15.11.2017    source источник
comment
Добро пожаловать в StackOverflow. Возможно, у вас мало времени, но если вам нужна помощь сообщества, лучше задать ясный вопрос. Узнайте, как написать хороший вопрос здесь: stackoverflow.com/help/how-to-ask. В настоящее время довольно сложно помочь, потому что 1) пример не воспроизводится без данных и 2) кажется, что существует много дополнительного кода, который не требуется.   -  person Michael Harper    schedule 15.11.2017
comment
Однако я полагаю, что вам придется агрегировать данные, прежде чем строить хороплет. Проверьте это: stackoverflow.com/questions/ 32618386 /   -  person Michael Harper    schedule 15.11.2017


Ответы (1)


Я автор choroplethr и, к сожалению, не могу понять ваш вопрос. Однако я думаю, что ключевая часть вашего вопроса такова:

Я хотел бы показать, в каком районе ЗИП наибольшая установленная мощность с течением времени.

Я не знаю, что именно означает «максимальная установленная мощность с течением времени» и как это значение определяется на основе имеющихся у вас данных.

Но choroplethr требует, чтобы ваши данные были в очень конкретном формате:

  1. Фрейм данных с одним столбцом с именем region и одним столбцом с именем value.
  2. Каждое значение в region должно соответствовать региону в вашем шейп-файле.

За кулисами choroplethr объединяет ваш фрейм данных с шейп-файлом. Если ваши данные содержат повторяющиеся области, то слияние не может произойти, потому что неясно, какое значение вы хотите использовать.

Прочитав ваш вопрос, я не совсем понимаю, какова ваша ситуация. Но я думаю, что вполне вероятно, что вы захотите обработать свои данные так, чтобы каждая область появлялась один раз, а значение было некоторой функцией двух файлов, о которых вы говорите.

Однако для полноты картины я упомяну, что, по крайней мере, возможно, что вы пытаетесь создать двумерная хороплета. Choroplethr в настоящее время не имеет такой функции.

person Ari    schedule 25.02.2018