Объединить несколько фреймов данных с частично совпадающими строками

#r

#r

Вопрос:

У меня есть фреймы данных со списками элементов, таких как ИМЕНА. У фреймов данных разные имена, но большинство из них совпадают друг с другом. Я хотел бы объединить их все в один список, в котором я бы увидел, отсутствуют ли какие-либо имена в каком-либо из df.

Образец ДАННЫХ для df1:

   X                    x
1 1 rh_Structure/Focus_S
2 2 rh_Structure/Focus_C
3 3 lh_Structure/Focus_S
4 4 lh_Structure/Focus_C
5 5   RH_Type-Function-S
6 6        RH_REFERENT-S
  

и для df2

   X                    x
1 1 rh_Structure/Focus_S
2 2 rh_Structure/Focus_C
3 3 lh_Structure/Focus_S
4 4 lh_Structure/Focus_C
5 5            UCZESTNIK
6 6                COACH
  

и ожидаемый результат был бы:

                   NAME. df1 df2
1                COACH  NA   6
2 lh_Structure/Focus_C   4   4
3 lh_Structure/Focus_S   3   3
4        RH_REFERENT-S   6  NA
5 rh_Structure/Focus_C   2   2
6 rh_Structure/Focus_S   1   1
7   RH_Type-Function-S   5  NA
8            UCZESTNIK  NA   5
  

Я могу сделать это с помощью merge.data.frame(df1, df2,by = «x», all = T),
но я не могу сделать это с большим количеством df с аналогичной структурой. Буду признателен за любую помощь.

Комментарии:

1. В чем проблема с использованием merge or *_join ? Вы просто хотите объединить более 2 фреймов данных? Если это так, взгляните на Reduce или purrr::reduce

Ответ №1:

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

 dfs <- c("df1","df2")
dfall <- do.call(rbind, Map(cbind, mget(dfs), src=dfs))
table(dfall$x, dfall$src)

#                        df1 df2
#   COACH                  0   1
#   lh_Structure/Focus_C   1   1
#   lh_Structure/Focus_S   1   1
#   RH_REFERENT-S          1   0
#   rh_Structure/Focus_C   1   1
#   rh_Structure/Focus_S   1   1
#   RH_Type-Function-S     1   0
#   UCZESTNIK              0   1
  

Комментарии:

1. Спасибо, но, честно говоря, мои циклы не работают должным образом, не могли бы вы написать один для меня? Все файлы имеют формат csv с одинаковым содержимым, но я не могу собрать их как фреймы данных и обработать, как вы предложили. Приведенное выше решение прекрасно. Мне просто нужно выполнить цикл или применить его ко всем CSV-файлам, чтобы создать один фрейм данных со всеми данными об именах в первом столбце. Данные говорят 1 о 0, поэтому имя существует или нет.

2. Однако у меня есть все данные из этих файлов, собранные в список, один за другим. Я не знаю, помогает ли это.