Обработка данных: как объединить два широкоформатных набора данных в один - PullRequest
0 голосов
/ 05 апреля 2020

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

enter image description here

Где столбец 1 - это список документов, а широкие столбцы - темы, найденные в этих документах (1, если в документе упоминается тема, 0, если в противном случае) И пусть набор данных B будет:

enter image description here Где столбец 1 - это тот же список, что и в наборе данных A, а остальные столбцы - страны. Значения представляют собой пользовательский код для того, насколько «важным» был этот документ для этой конкретной страны (например, 5 очень важно, 1 неважно, 0 не участвует в документе). Я хотел бы объединить оба в один широкий набор данных, где строки - это страны, а столбцы - темы. Значения внутри ячеек будут равны сумме случаев, когда страна взаимодействует с темой через документ, взвешенная с помощью кодирования «важность» для набора данных B. Готовый набор данных будет выглядеть так: enter image description here Например, AFG участвовал только в документе A / C .3 / 64 / L.6, значение 5, и поскольку в этом документе упоминается только «Доступ к информации», AFG взаимодействует с topi c - 5. И , в свою очередь, участвовал во всех документах и ​​таким образом получил задание по темам «Похищение» (1 * 5 = 5), «Аборт» (1 * 1 = 1), «Академический c степень» (1 * 1 + 1) * 2 = 3) и «Доступ к информации» (1 * 4 = 4). Проблема в том, что полные наборы данных A и B имеют более 1 тыс. Тем и 190 стран соответственно. Поэтому мне нужно найти автоматизированный способ сделать это слияние. Буду признателен за совет, как это сделать в Excel или R. Большое спасибо

Ответы [ 3 ]

1 голос
/ 05 апреля 2020

Очень просто сделать в Excel, если у вас есть версия с Power Query (в основном, с 2010 года).

Если у вас есть наборы данных в текущем файле, отформатированные в виде таблиц Excel, нажмите на Набор данных один , go to Data => «Получить и преобразовать данные» и выбрать «Из таблицы / диапазона»

enter image description here

После загрузки PQ выберите столбец 1 и получил значение Transform => UniPivot Columns => Другие столбцы

enter image description here

, что приведет к неповращенному набору данных 1

enter image description here

Повторите вышеуказанные 3 шага, начиная с выбранной таблицы набора данных2, в результате чего будет получен неотключенный набор данных2

enter image description here

Затем выберите Dataset1 в PQ, go to Home => Merge Queries => Merge Queries as New. В окне слияния объедините 2 набора данных в столбце 1

enter image description here enter image description here

Следующим шагом является расширение столбца DataSet2. отмените выбор Столбца 1, так как он не нужен. Это даст вам расширенную таблицу.

enter image description here enter image description here

Выберите значение и набор данных2 Столбцы .Value и go Добавить столбец => Стандарт => Умножение

enter image description here

Выберите столбцы Атрибут, Dataset2.Attribute и Multiplication и go to Home => Удалить столбцы => Удалить другие столбцы

enter image description here

Выберите столбцы атрибутов, затем go to Home => Сводный столбец. В окне Опция сводных столбцов выберите Умножение в качестве столбца Значения и Сумма в качестве функции совокупного значения.

enter image description here enter image description here

Что даст вам необходимый вывод

enter image description here

Затем, наконец, go на верхнюю левую кнопку в окне PQ и выберите Close & Load => Закрыть и загрузить в и выбрать загрузку в виде таблицы на новом листе, которая даст вам ваш окончательный результат

enter image description here enter image description here

Первая часть будет немного отличаться в зависимости от того, «где» находятся данные - ie в файлах .csv, отдельных книгах Excel, в базе данных и т. Д. c, но это можно отрегулировать в соответствии с требованиями. Также вы можете изменить имена столбцов и т.д. c.

1 голос
/ 05 апреля 2020

Для данных вашего примера, в которых предполагается, что A и B имеют одинаковые строки и в одинаковом порядке, следующий код дает желаемый результат:

t(t(as.matrix(A[,-1])) %*% as.matrix(B[,-1]))

    abduction abortion academic access
AFG         0        0        0      5
AGO         0        4        4      0
ALB         0        3        3      1
AND         5        1        3      4

При этом используется умножение матриц.

Для ваших реальных наборов данных (темы 1К и 190 стран) вам нужно будет убедиться, что обе они содержат одинаковое количество строк, и что они находятся в одинаковом порядке на основе столбца общего индекса. Если нет, то вам нужно сохранить только те записи, которые имеют одинаковые, а затем отсортировать их по этому общему столбцу индекса. Это тривиально.


Данные

> A
  id abduction abortion academic access
1  A         1        0        0      0
2  B         0        1        1      0
3  C         0        0        1      0
4  D         0        0        0      1

> B
  id AFG AGO ALB AND
1  A   0   0   0   5
2  B   0   4   3   1
3  C   0   0   0   2
4  D   5   0   1   4

A <- structure(list(id = structure(1:4, .Label = c("A", "B", "C", 
"D"), class = "factor"), abduction = c(1, 0, 0, 0), abortion = c(0, 
1, 0, 0), academic = c(0, 1, 1, 0), access = c(0, 0, 0, 1)), row.names = c(NA, 
-4L), class = "data.frame")

B <- structure(list(id = structure(1:4, .Label = c("A", "B", "C", 
"D"), class = "factor"), AFG = c(0, 0, 0, 5), AGO = c(0, 4, 0, 
0), ALB = c(0, 3, 0, 1), AND = c(5, 1, 2, 4)), row.names = c(NA, 
-4L), class = "data.frame")
1 голос
/ 05 апреля 2020

Во-первых, я бы посоветовал вам изучить, что делает данные Tidy, у вас должен быть столбец с именем "страна", а не строки, являющиеся странами.

попробуйте использовать пакет "dplyr" в tidyverse .. .

inner_join('Dataset A','Dataset B", by = "column_name")

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...