Отображение значений столбца данных в матрице n n на n - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь отобразить значения столбцов объекта data.frame (состоящего из большого числа данных о двусторонней торговле среди 161 страны) в матрицу смежности 161 x 161 (также класса data.frame) так, чтобы каждая ячейка представляла торговые потоки между любыми двумя странами.

Данные выглядят так

# load the data from dropbox folder
library(foreign)
example_data <- read.csv("https://www.dropbox.com/s/hf0ga22tdjlvdvr/example_data.csv?dl=1")

head(example_data, n = 10)
   rid pid TradeValue
1    2   3        500
2    2   7       2328
3    2   8    2233465
4    2   9      81470
5    2  12     572893
6    2  17     488374
7    2  19    3314932
8    2  23      20323
9    2  25         10
10   2  29    9026220

length(unique(example_data$rid))
[1] 139
length(unique(example_data$pid))
[1] 161

, где rid - идентификатор репортера, pid - (торговый) идентификатор партнера, страны rid и pid одинаковы. Одинаковые идентификаторы в столбце rid сопоставляются с несколькими строками в столбце pid в терминах TradeValue.

Однако с этими данными есть некоторые проблемы. Во-первых, поскольку страны (обычно развивающиеся страны), которые не представили статистику торговли, не имеют данных для извлечения, их идентификаторы отсутствуют в столбце rid (например, страна 1). С другой стороны, идентификаторы этих стран могут вводиться в столбец pid через отчеты других стран (в этом случае репортеры, как правило, являются развитыми странами). Следовательно, столбец rid содержит только часть идентификатора страны (только 139 из 161), а столбец pid содержит все 161 идентификатора страны.

Я пытаюсь сопоставить этот example_data фрейм данных с матрицей смежности 161 x 161, используя rid для строки и pid для столбца, где каждая ячейка представляет TradeValue между любыми двумя идентификаторами страны. , Для этого есть пара вещей, с которыми мне нужно разобраться:

  1. Заполните те идентификаторы стран, которые отсутствуют в столбце rid example_data, и временно установите для всех значений ячеек в соответствующих строках значение 0.
  2. На предыдущем этапе вменять эти ячейки "0", используя статистику двусторонней торговли, сообщаемую другими странами; если соответствующая статистика по-прежнему недоступна, оставьте эти ячейки «0» такими, какие они есть.

Например, для кадра данных из 5 стран следующей формы

rid pid TradeValue
2   1   50
2   3   45
2   4   7
2   5   18
3   1   24
3   2   45
3   4   88
3   5   12
5   1   27
5   2   18
5   3   12
5   4   92

Желаемый результат должен выглядеть следующим образом

     pid_1  pid_2   pid_3   pid_4   pid_5
rid_1    0    50      24        0      27
rid_2   50     0      45        7      18
rid_3   24    45       0       88      12
rid_4    0     7      88        0      92
rid_5   27    18      12       92       0

но, на мой взгляд, я не мог понять, как это сделать. Буду очень признателен, если кто-нибудь поможет мне в этом.

1 Ответ

0 голосов
/ 08 ноября 2018
df1$rid = factor(df1$rid, levels = 1:5, labels = paste("rid",1:5,sep ="_"))
df1$pid = factor(df1$pid, levels = 1:5, labels = paste("pid",1:5,sep ="_"))

data.table::dcast(df1, rid ~ pid, fill = 0, drop = FALSE, value.var = "TradeValue")

#    rid pid_1 pid_2 pid_3 pid_4 pid_5
#1 rid_1     0     0     0     0     0
#2 rid_2    50     0    45     7    18
#3 rid_3    24    45     0    88    12
#4 rid_4     0     0     0     0     0
#5 rid_5    27    18    12    92     0

Секреты / хитрости:

  • используйте факторные переменные, чтобы указать R, какие значения возможны, а также порядок.

  • в data.tables dcast использовать fill = 0 (заполнить ноль там, где у вас ничего нет), drop = FALSE (сделать записи для уровней факторов, которые не наблюдаются)

...