#r #merge
#r #слияние
Вопрос:
Я пытаюсь объединить 2 фрейма данных ( 1960
и 2000
). Эти фреймы данных имеют разную длину, но имена столбцов одинаковы. Моей первой попыткой было использовать plyr
пакет и привязку на основе имен столбцов:
library(plyr)
combined <- rbind.fill(1960[c("Name","Gender","1960")],2000[c("Name","Gender","2000")])
Это было нормально, но я заметил, что он неправильно объединял строки. Выборка данных во фрейме данных показывает, что в первой строке нет женщин по имени Аарон 1960 года рождения, но в 3-й строке показано, что их 20.
Name Gender 1960 2000
Aaron F NA 35 29613
Aaron M NA 9548 2728
Aaron F 20 NA 7511
Aaron M 1772 NA
Затем я попробовал smartbind
, но получил тот же результат:
library(gtools)
t <- smartbind(1960, 2000)
Я не уверен, как заставить женские и мужские записи соответствовать. Я также пытался объединить фреймы данных, но мне не очень нравится результат.
m <- merge(1960, 2000, by = c("Name"), all = TRUE)
m[is.na(m)] <- 0
Если бы кто-нибудь мог посоветовать, как я могу правильно выстроить строки в соответствии с именем и полом, я был бы очень признателен.
Редактировать: Два фрейма данных состоят из 3 столбцов: Name
, Gender
и Total
. Total
Столбец представляет количество людей за год с определенным именем. Фрейм данных 1960 года показывает общее количество по имени за этот год, а фрейм данных 2000 года показывает общее количество за этот год. Когда я объединяю 2 фрейма данных, вывод:
Name Gender.x 1960 Gender.y 2000
Aaron F 20 F 35
Aaron F 20 M 9548
Aaron M 1772 F 35
Aaron M 1772 M 9548
Что мне не нравится в их слиянии, так это то, что пол M и F отображаются в одной строке. Я могу манипулировать ими в выводе фрейма данных, чтобы они выстраивались в линию, но я бы предпочел создать его правильно с помощью кода, если вы понимаете, что я имею в виду?
Комментарии:
1. Можете ли вы привести нам примеры фреймов данных 1960 и 2000 годов? И каков, собственно, ваш ожидаемый результат? Если цель состоит в том, чтобы иметь фрейм данных с отдельными столбцами для 1960 и 2000 имен, тогда
merge
это правильный путь. Что в результате вам не нравится?2. Проблема здесь, по-видимому, заключается в том, что у вас нет уникального идентификатора для наблюдений, с помощью которого вы можете объединить. Если вы объединяете только по имени, а несколько пользователей имеют одно и то же имя, команда слияния не может узнать, кто является одним и тем же человеком. Вы можете попытаться создать уникальный идентификатор, объединив несколько столбцов с
paste0
помощью команды.3. Спасибо jdobres, Daniel Winkler и Scarabee за вашу помощь. Я только начинаю с R и все еще пытаюсь разобраться в этом. Я отредактировал свой исходный пост с дополнительной информацией. Я попробую маршрут с уникальным идентификатором и посмотрю, как это работает. Спасибо!
4. Команда будет выглядеть примерно так
yob1960$id<-paste0(yob1960$Name, yob1960$Gender)
же и для yob2000. Это создает новый столбец с именем и полом в виде одной строки, таким образом, вы можете сопоставлять людей по этому столбцу на основе имени и пола.5. Или попробуйте
m <- merge(yob1960, yob2000, by = c("Name", "Gender" ), all = TRUE)
Ответ №1:
В заключение вопроса и для дальнейшего использования :
m <- merge(yob1960, yob2000, by = c("Name", "Gender" ), all = TRUE)
Это сохранит комбинации имени и пола в одной строке в течение обоих лет.