Назначьте средние значения и / или условное присвоение для неупорядоченных двойных диад - PullRequest
0 голосов
/ 07 декабря 2018

Я столкнулся с чем-то немного выше моего набора навыков.Я работаю с торговыми данными МВФ, которые состоят из данных между диадами стран.Набор данных МВФ состоит из «неупорядоченных дубликатов» записей, в которых каждая страна отдельно представляет данные о торговле.Однако из-за различных временных характеристик, систем записи, типа режима и т. Д. Существуют несоответствия между соответствующими значениями.Я пытаюсь манипулировать этими данными двумя способами:

  1. Назначить средние значения для дублированных диад.
  2. Назначить значения диад условно на основе отдельного экономического показателя или индекса развития(кому я больше доверяю?).

Существует несколько дискуссий по выявлению неупорядоченных дубликатов здесь , здесь , здесь здесь но после пары дней поиска мне еще предстоит увидеть, что я пытаюсь сделать.

Вот пример необработанных данных.В действительности существует гораздо больше переменных и несколько сотен тысяч диад:

reporter<-c('USA','GER','AFG','FRA','CHN')
partner<-c('AFG','CHN','USA','CAN','GER')
year<-c(2010,2010,2010,2009,2010)
import<-c(-1000,-2000,-2400,-1200,-2000)
export<-c(2500,2200,1200,2900,2100)
rep_econ1<-c(28,32,12,25,19)

imf<-data.table(reporter,partner,year,import,export,rep_econ1)

imf

   reporter partner year import export rep_econ1
1:      USA     AFG 2010  -1000   2500        28
2:      GER     CHN 2010  -2000   2200        32
3:      AFG     USA 2010  -2400   1200        12
4:      FRA     CAN 2009  -1200   2900        25
5:      CHN     GER 2010  -2000   2100        19

Дополнительная складка заключается в том, что import и export являются инверсиями друг друга между диадами, поэтому их необходимо сопоставлять иозначает абсолютное значение.

Для цели 1 получим data.table:

Среднее

 reporter   partner year    import  export  rep_econ1
  USA        AFG    2010    -1100   2450    28
  GER        CHN    2010    -2050   2100    32
  AFG        USA    2010    -2450   1100    12
  FRA        CAN    2009    -1200   2900    25
  CHN        GER    2010    -2100   2050    19

Для задачи 2:

Условно присвоить более высокий экономический показатель (rep_econ1)

 reporter   partner year    import  export  rep_econ1
 USA         AFG    2010    -1000   2500    28
 GER         CHN    2010    -2000   2200    32
 AFG         USA    2010    -2500   1000    12
 FRA         CAN    2009    -1200   2900    25
 CHN         GER    2010    -2200   2000    19

Возможно, не все диады представлены дважды, поэтому я включил сольную запись.Я предпочитаю data.table, но я пойду со всем, что приведет меня по правильному пути.

Спасибо за ваше время.

1 Ответ

0 голосов
/ 07 декабря 2018

Предварительная обработка:

library(data.table)

# get G = reporter/partner group and N = number of rows for each group
# Thanks @eddi for simplifying
imf[, G := .GRP, by = .(year, pmin(reporter, partner), pmax(reporter, partner))]
imf[, N := .N, G]

Вариант 1 (означает)

# for groups with 2 rows, average imports and exports
imf[N == 2
    ,   `:=`(import = (import - rev(export))/2
           , export = (export - rev(import))/2)
    , by = G]

imf


#    reporter partner year import export rep_econ1 G N
# 1:      USA     AFG 2010  -1100   2450        28 1 2
# 2:      GER     CHN 2010  -2050   2100        32 2 2
# 3:      AFG     USA 2010  -2450   1100        12 1 2
# 4:      FRA     CAN 2009  -1200   2900        25 3 1
# 5:      CHN     GER 2010  -2100   2050        19 2 2

Вариант 2 (самый высокий экономический показатель)

# for groups with 2 rows, choose imports and exports based on highest rep_econ1
imf[N == 2
    , c('import', 'export') := {
        o <- order(-rep_econ1)
        import <- cbind(import, -export)[o[1], o]
        .(import, export = -rev(import))}
    , by = G]

imf


#    reporter partner year import export rep_econ1 G N
# 1:      USA     AFG 2010  -1000   2500        28 1 2
# 2:      GER     CHN 2010  -2000   2200        32 2 2
# 3:      AFG     USA 2010  -2500   1000        12 1 2
# 4:      FRA     CAN 2009  -1200   2900        25 3 1
# 5:      CHN     GER 2010  -2200   2000        19 2 2

Объяснение варианта 2:Вам нужно выбрать строку с наивысшим экономическим показателем (т. Е. Строку order(-rep_econ1)[1]) и использовать ее для imports, но если вторая строка является «доверенной», ее необходимо повернуть вспять.В противном случае вы изменили бы страны, так как импорт второго репортера (теперь первый элемент cbind(import, -export)[o[1],]) был бы назначен как импорт первого репортера (потому что это первый элемент).

Редактировать:

Если импорт и экспорт являются положительными во входных данных и должны быть положительными в выходных данных, два приведенных выше вычисления можно изменить как

imf[N == 2
    ,   `:=`(import = (import + rev(export))/2
           , export = (export + rev(import))/2)
    , by = G]

А

imf[N == 2
    , c('import', 'export') := {
        o <- order(-rep_econ1)
        import <- cbind(import, export)[o[1], o]
        .(import, export = rev(import))}
    , by = G]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...