Rbind и слияние в R

Итак, у меня есть большой список фреймов данных, и у некоторых из них есть соответствующие столбцы, а у других нет. Я хочу rbind с совпадающими столбцами и объединить другие, у которых нет совпадающих столбцов (на основе переменных Year, Country). Однако я не хочу вручную просматривать все кадры данных, чтобы увидеть, какие из них имеют совпадающие столбцы, а какие нет.

Теперь я думал, что это будет выглядеть примерно так:

myfiles = list.files(pattern="*.dta")
dflist <- lapply(myfiles, read.dta13)

for (i in 1:length(dflist)){

  if colnames match
    put them in list and rbindlist.
  else put them in another list and merge.
}    

Помимо того, что я не знаю, как именно это сделать в R, я начинаю думать, что в конце концов это не сработает.

Для иллюстрации рассмотрим 6 фреймов данных:

Dataframe 1:                          Dataframe 2:

Country Sector Emp              Country   Sector Emp
Belg      A     35                NL        B     31
Aus       B     12                CH        D     45
Eng       E     18                RU        D     12

Dataframe 3:                      Dataframe 4:
Country Flow    PE               Country  Flow PE   
NL        6     13                 ...    ...   ... 
HU        4     11                 ...    ...
LU        3     21                 ...

Dataframe 5:              dataframe 6:

Country Year Exp          Country Year Imp 
 GER     02   44           BE      00   34
 GER     03   34           BE      01   23
 GER     04   21           BE      02   41 

В этом случае я хотел бы rbind (dataframe 1, dataframe2) и rbind (dataframe 3, dataframe 4), и я хотел бы объединить данные 5 и 6 на основе переменных страны и года. Таким образом, мой вывод будет состоять из нескольких rbinded/объединенных фреймов данных.


person Oscar    schedule 14.07.2016    source источник
comment
Я думаю, что слияние (с all=TRUE) приведет к rbind (хотя и медленнее), поэтому может сработать просто объединить их все вместе. Чтобы сделать это, stackoverflow.com/questions/8091303/   -  person Aaron left Stack Overflow    schedule 15.07.2016
comment
любое обновление для этого? вы нашли способ решить эту проблему?   -  person Stataq    schedule 23.11.2020


Ответы (2)


Rbind завершится ошибкой, если столбцы не совпадают. Как было предложено, вы можете использовать merge или left_join из пакета dplyr.

Может быть, это сработает: do.call(left_join, dflist)

person Ulrik    schedule 15.07.2016

Для одного и того же фрейма данных столбцов вы можете объединить или объединить все операции. union удалит все повторяющиеся значения, и если вам нужны повторяющиеся записи, используйте Union all. (Для фрейма данных 1 и фрейма данных 2) & (Для фрейма данных 3 и фрейма данных 4) используйте операцию Union или Union all. Для фрейма данных 5 и фрейма данных 6 используйте

merge(x= dataframe5, y=dataframe6, by=c("Country", "Year"), all=TRUE) 
person lalit panwar    schedule 20.09.2018