2016-08-03 45 views
0

Ich habe zwei Datenrahmen von Länderdaten. df1 hat alle Länder der Welt. df2 hat eine Untergruppe von Ländern, hat aber die Populationen in einer seiner Spalten. Ich möchte die Bevölkerungsdaten nehmen und sie zu df1 hinzufügen, wo die Ländernamen übereinstimmen.Binding Datenrahmen mit übereinstimmenden Ländernamen

Wenn df1$Column1 = df2$Column1 (gleiche Ländernamen), dann füllen df1$Column2 (derzeit leer) mit den Informationen aus df2$Column2 (Landesbevölkerung), wo die Reihe die derjenige für die jeweilige Land Übereinstimmung vorhanden ist.

Ich versuchte, die beide mit der Spalte „Namen“ zu verschmelzen, die sie sowohl für die Ländernamen haben:

total <- merge(map,Co2_2x, by="NAME") 

die Spalten sind alle da, aber ich leere Zeilen in meinem neuen Datenrahmen erhalten.

Ich würde gerne in der Lage sein zu sagen "für diese Zeile und Spalte Matrixposition in DF1 (das Land), erhalten Sie die Zeile (Ländername übereinstimmen in df2) und Spalte X (Bevölkerungsdaten). Dann legen Sie es diese Zeilen- und Spaltenposition Y-Matrix in df1 (neue Population Spalte in df1 für den angepassten Ländernamen)“... Es muss einen einfacheren Weg geben :-)

Hier ist mein Code: ich möchte map$measure füllen mit Daten von Co2_2x$premium, wo die Länder übereinstimmen.

library(XML) 
library(raster) 
library(rgdal) 
download.file("http://thematicmapping.org/downloads/TM_WORLD_BORDERS_SIMPL-0.3.zip",destfile="TM_WORLD_BORDERS_SIMPL-0.3.zip") 
unzip("TM_WORLD_BORDERS_SIMPL-0.3.zip",exdir=getwd()) 
polygons <- shapefile("TM_WORLD_BORDERS_SIMPL-0.3.shp") 

polygons 
map <- as.data.frame(polygons) 

map$Measure <- 0 

library(rvest) 
Co2 <- read_html("https://en.wikipedia.org/wiki/List_of_countries_by_carbon_dioxide_emissions") 

Co2_2x<-Co2 %>% 
    html_nodes("table") %>% 
    .[[1]] %>% 
    html_table() 

names(Co2_2x)[2]<-paste("premium") 

names(Co2_2x)[1]<-paste("NAME") 


total <- merge(map,Co2_2x, by="NAME") 

Vielen Dank!

+0

Hallo Peter, willkommen in SO. Was haben Sie versucht, Ihr Problem anzugehen? Wir müssen das wissen, um richtige Ratschläge zu geben. – Vincent

+0

Hallo Vincent, ich habe versucht, die beiden zusammenzufassen, indem ich die Spalte "Name" verwende, die beide für Ländernamen haben. total <- merge (map, Co2_2x, by = "NAME") Aber ich bekomme leere Zeilen in meinem neuen Datenrahmen, aber die Spalten sind alle da. –

+0

Ok. Können Sie das bitte in Ihrer Frage und nicht im Kommentar erklären? – Vincent

Antwort

0

ohne Spiel die ersten Datensatz Reihen haben, in dem anderen Daten-Set erscheint, müssen Sie nur die all.x=T Option hinzufügen, wie folgt (bei the documentation Details einen Blick):

total <- merge(map,Co2_2x, by="NAME",all.x=T) 

Diese Zeilen werden Dann erscheinen mit NA in den zweiten Datensatz Spalten.

Wenn die Übereinstimmung nicht zu funktionieren scheint, sollten Sie sicherstellen, dass die passende Variable (in Ihrem Fall NAME) genau so in den beiden Datensätzen gefüllt ist (Groß-/Kleinschreibung, mögliche Leerzeichen an den Extremitäten) ...). This answer bietet eine gute Möglichkeit, dies zu tun.

+0

Danke. Das hat ein bisschen funktioniert. Ich bekomme die Spalten hinzugefügt, aber alle ihre Daten sind "NA" in jedem Feld. –

+0

Ich wünschte, ich könnte die richtige Tabelle herunterladen ... Aber mit dem Test DF ich verwendet, die 'NA' auftreten, nur wenn keine Übereinstimmung für' df1's x-Wert in 'df2'. Sind Sie sicher, dass die beiden Namensspalten wirklich übereinstimmen? Es könnte zum Beispiel Leerzeichen am Ende eines geben? – Vincent

+0

Ja! Einer hat "China", der andere hat "China" mit einem Raum. :-) –

0

Sie sqldf Bibliothek in R.

einfach den Code folgen unten verwenden können. Sie werden in der Lage sein, zu fusionieren (zusammen), um die beiden Datenmengen, die Sie haben:

library(sqldf) 
merged_data <- sqldf("select a.country, b.population from df1 as a 
        left join df2 as b on (a.country = b.country) group by 1") 

Dank und glückliche R-Programmierung !!!

+0

> merged_data <- sqldf ("wähle map.NAME, Co2_2x.premium aus der Karte als linker Join Co2_2x als NAME auf (map.NAME = Co2_2x.NAME) Gruppe nach 1") Fehler in sqliteSendQuery (con, statement, bind .data): Fehler in der Aussage: keine solche Spalte: map.NAME –

+0

Meine df "Karte" hat eine Spalte namens "NAME". Sie haben es beide als Spalte mit Ländernamen ... Habe ich etwas anderes falsch gemacht? –

+0

habe ich versucht, diese und bekam die Säule gegeben, aber alle Elemente in der Spalte sind "NA": Bibliothek (sqldf) merged_data <- sqldf ("select * Karte , Co2_2x.premium von Karte Co2_2x beitreten links auf. map.NAME = Co2_2x.NAME ") –