Расчесывание фрейма данных, строки выстраиваются неправильно

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

Это сохранит комбинации имени и пола в одной строке в течение обоих лет.