Создать уникальный идентификатор для диад. Ненаправленного - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть фрейм данных, который включает данные об импорте и экспорте страны / года в другие страны. Как и в примере набора данных, данные по двоичному импорту и экспорту не полностью совпадают.

например.

library(tidyverse)

df <- data.frame("Reporter" = c("USA", "USA", "USA", "USA", "USA", "USA", "USA", "USA", "Africa","Africa", "Africa","Africa", "Africa","Africa", "Africa","Africa", "EU", "EU","EU", "EU", "EU", "EU","EU", "EU"), 
                 "Partner" = c("Africa","Africa", "Africa","Africa","EU", "EU","EU", "EU", "USA", "USA", "USA", "USA", "EU", "EU","EU", "EU","USA", "USA", "USA", "USA","Africa","Africa", "Africa","Africa"),
                 "Year" = c(1970, 1970, 1980, 1980, 1970, 1970, 1980, 1980, 1970, 1970, 1980, 1980, 1970, 1970, 1980, 1980,  1970, 1970, 1980, 1980, 1970, 1970, 1980, 1980), 
                 "Flow" = c("Import", "Export","Import", "Export","Import", "Export","Import", "Export","Import", "Export","Import", "Export","Import", "Export","Import", "Export","Import", "Export","Import", "Export","Import", "Export","Import", "Export"),
                 "Val" = runif(24, min=0, max=100), stringsAsFactors = FALSE)                    

и я создаю широкую версию этих данных.

wide_df <- df %>% spread ("Flow", "Val")

Я могу создавать идентификаторы направлений для диад.

wide_df$ReporterID  <- as.numeric(factor(wide_df$Reporter, levels=unique(wide_df$Reporter)))

Однако полученные данные считают разными, например, диады США и Африки, а также Африки и США.

Вопрос: Как создать уникальный идентификатор для каждого диада?

Может кто-нибудь придумать способ, позволяющий мне свести эти диады в один идентификационный код

Спасибо за внимание!

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Мы создаем уникальные идентификаторы с помощью paste минимальных и максимальных значений соответствующих элементов Reporter, Partner для каждой строки (pmin, pmax), конвертируем их в factor и приводим до numeric or using Тидиверс`

library(tidyverse)
wide_df %>%
   mutate(newid = as.numeric(factor(paste(pmin(Reporter, Partner), 
                           pmax(Reporter, Partner), sep="_"))))
#   Reporter Partner Year    Export   Import newid
#1     Afica      EU 1970 23.494073 62.50156     1
#2     Afica      EU 1980 18.808975 52.17495     1
#3     Afica     USA 1970 23.679063 37.02527     2
#4     Afica     USA 1980  2.346382 21.69631     2
#5        EU   Afica 1970 73.075570 78.00496     1
#6        EU   Afica 1980 69.620370 60.24295     1
#7        EU     USA 1970 89.163190 80.78952     3
#8        EU     USA 1980 77.462146 48.51146     3
#9       USA   Afica 1970 18.285198 99.99596     2
#10      USA   Afica 1980 26.119664 40.51762     2
#11      USA      EU 1970 78.307579 70.91757     3
#12      USA      EU 1980 41.067151 84.06877     3
0 голосов
/ 13 сентября 2018
library(tidyverse)

# vectorised function to order and combine values
f = function(x,y) paste(sort(c(x, y)), collapse="_")
f = Vectorize(f)

df %>% 
  spread ("Flow", "Val") %>%
  mutate(ID1 = f(Reporter, Partner),
         ID2 = as.numeric(as.factor(ID1)))

#   Reporter Partner  Year Export Import ID1         ID2
# 1 Afica    EU       1970  56.6  98.9   Afica_EU      1
# 2 Afica    EU       1980  95.3   2.25  Afica_EU      1
# 3 Afica    USA      1970  50.4  10.3   Afica_USA     2
# 4 Afica    USA      1980  29.4   3.08  Afica_USA     2
# 5 EU       Afica    1970  88.8  56.3   Afica_EU      1
# 6 EU       Afica    1980  53.6  48.0   Afica_EU      1
# 7 EU       USA      1970   4.50 83.8   EU_USA        3
# 8 EU       USA      1980  79.1   0.473 EU_USA        3
# 9 USA      Afica    1970  61.9  37.2   Afica_USA     2
#10 USA      Afica    1980   9.88 39.6   Afica_USA     2
#11 USA      EU       1970  10.4  29.3   EU_USA        3
#12 USA      EU       1980  21.1  35.3   EU_USA        3

Один параметр - ID1, который объединяет фактические значения.

Другой параметр - ID2, который создает число на основе ID1.

Логика этих ID2 чисел - это порядок уровня factor переменной ID1 (т.е. в алфавитном порядке в данном случае).

Если вам не нужноИсходные столбцы Reporter и Partner вы можете исключить их, используя unite(ID1, Reporter, Partner, remove = T) или select(-Reporter, -Partner) в конце процесса.

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