Слияние больших фреймов данных с неравными именами столбцов в R - PullRequest
0 голосов
/ 11 мая 2019

У меня есть два кадра данных в R, один из них довольно большой (скажем, 150000 наблюдений с 160 переменными) и один меньший (76 наблюдений по 5 переменным).

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

  1. Одна проблема состоит в том, что не все страны представлены в меньшем кадре данных, и я хотел бы отбросить наблюдения в моем первом кадре из страны, не представленной во втором.
  2. Вторая проблема заключается в том, что мне кажется, что я не могу использовать стандартную функцию слияния, поскольку второй кадр данных форматируется следующим образом:
Country Var1        Var2        Var3        Var4        Var5
NIC     -0.61252    -0.54723    -0.41597    -0.38825    -0.17819
RWA     -0.60603    -0.28969    -0.57998    -0.05933    -0.14199
GEO     -0.48543    -0.08132    0.56275     -0.25436    0.62782

Пока мой первый кадр данных отформатирован следующим образом

CNTRY Var1 Var2 etc

Похоже, мне нужно самому жестко закодировать функцию?

Ответы [ 2 ]

0 голосов
/ 11 мая 2019

Если мы назовем большую df1, а маленькую df2, вы сможете сделать соединение, удовлетворяющее вашим требованиям.Если я правильно понимаю ваш вопрос, вам нужен фрейм данных с множеством строк (около 150 тыс.), К каждому из которых прикреплены атрибуты страны.Но вы хотите отбросить любую из 150-тысячных строк, которые не имеют соответствующей страны.

В соответствии с предложением @aurelianoguedes вы должны просто сразу выполнить внутреннее объединение, которое избавит от любых строк в большом кадре данных, которые не совпадают в маленьком df.

df.merged = dplyr::inner_join(df1, df2, by=c('Country' = 'CNTRY'))

Старое решение с фильтром + left_join:

df.merged = df1 %>%
  filter(Country %in% df2$CNTRY) %>%
  left_join(df2, by=c('Country' = 'CNTRY'))
0 голосов
/ 11 мая 2019

вы можете использовать:

для 1:

library(dplyr)
bigdataframe %>% filter(Country%in%smalldataframe$CNTRY) -> newdataframe

для 2:

merge(smalldataframe, newdataframe, by = c("CNTRY","Country"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...