2016-08-03 4 views
0

У меня есть два фрейма данных страны. df1 имеет все страны мира. df2 имеет подмножество стран, но имеет популяции в одной из своих колонок. Я хочу взять данные о населении и добавить его в df1, где названия стран совпадают.Связывание данных с соответствующими названиями стран

Если df1$Column1 = df2$Column1 (такое же название страны), а затем заполнить df1$Column2 (в настоящее время пуст) с информацией из df2$Column2 (населения страны), где строка является одним для этого матча страны.

Я попытался объединить два с помощью столбца «Имя», которое они оба имеют названий стран:

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

колонны все там, но я получаю пустые строки в моем новом dataframe.

Я бы хотел сказать «для этой позиции строки и столбца в df1 (стране), получить строку (название страны соответствует df2) и столбцу X (данные о населении). Затем поместить его в эта строка и столбец позиции Y матрицы в df1 (новый столбец населения в df1 для названия согласованной страны)»... Там должно быть проще :-)

Вот мой код: Я хотел бы, чтобы заполнить map$measure с данными от Co2_2x$premium, где страны совпадают.

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") 

Спасибо!

+0

Привет, Питер, добро пожаловать в SO. Что вы попытались решить вашу проблему? Мы должны знать это, чтобы дать правильные советы. – Vincent

+0

Привет Винсент, я попытался объединить эти два, используя столбец «Имя», который у них обоих есть для названий стран. total <- merge (map, Co2_2x, by = "NAME") Но я получаю пустые строки в своем новом фреймворке данных, но столбцы все там. –

+0

Хорошо. Не могли бы вы объяснить это в своем вопросе, а не в комментарии? – Vincent

ответ

0

Чтобы иметь первые строки набора данных не совпадает с другим набором данных появится, вам просто нужно добавить опцию all.x=T, следующим образом (обратите внимание на the documentation подробности):

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

Этих строки будут затем появятся с NA во вторых столбцах набора данных.

Если сопоставление не работает, вы можете убедиться, что соответствующая переменная (в вашем случае, NAME) заполняется exaccty одинаково в двух наборах данных (буквенный регистр, возможные пробелы на концах ...). This answer обеспечивает прекрасный способ сделать это.

+0

Спасибо. Это немного поработало. Я получаю столбцы, но все их данные являются «NA» в каждом поле. –

+0

Хотелось бы, чтобы я мог загрузить нужную таблицу ... Но с использованием теста DF, который я использовал, 'NA' происходит только тогда, когда в' df2' нет значения для значения 'df1' x. Вы уверены, что две колонки имен действительно совпадают? Могут быть пробелы в конце одного, например? – Vincent

+0

Да! У одного есть «Китай», у другого есть «Китай» с пространством. :-) –

0

вы можете использовать sqldf библиотеку в R.

Просто следуйте ниже код. Вы сможете объединить (присоединиться) два набора данных, которые у вас есть:

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") 

Спасибо и счастливого R-программирование !!!

+0

> merged_data <- sqldf ("select map.NAME, Co2_2x.premium с карты как левое объединение Co2_2x как NAME на (map.NAME = Co2_2x.NAME) группа на 1") Ошибка в sqliteSendQuery (con, statement, bind .data): error in statement: no такой столбец: map.NAME –

+0

У моей df "map" есть столбец с именем "NAME". У них обоих есть столбец с названиями стран ... Я сделал что-то еще неправильно? –

+0

Я попробовал это и получил добавил колонку, но все элементы в столбце «NA»: библиотека (sqldf) merged_data <- sqldf ("выберите карту * , Co2_2x.premium с карты покинул присоединиться Co2_2x на. map.NAME = Co2_2x.NAME ") –

Смежные вопросы