#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. Однако у меня есть все данные из этих файлов, собранные в список, один за другим. Я не знаю, помогает ли это.