为无序重复二元组分配平均值和/或条件赋值

时间:2018-12-07 17:36:42

标签: r dplyr data.table

我遇到了一些超出我的技能范围的事情。我正在使用由国家二元组之间的数据组成的IMF贸易数据。 IMF数据集由“无序重复”记录组成,每个国家单独报告贸易数据。但是,由于各种定时,记录系统,状态类型等,相应值之间存在差异。我试图通过两种方式来处理这些数据:

  1. 将平均值分配给重复的二元组。
  2. 根据单独的经济指标或发展指数(我对谁更信任?)有条件地分配dyad值。

关于识别无序重复项herehereherehere的讨论很多,但是经过几天的搜索,我还没有看到我正在尝试做。

这是原始数据的示例。实际上,还有更多的变量和数十万个二元组:

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

另外的皱纹是importexport在二元组之间彼此相反,因此它们需要匹配并具有绝对值。

对于目标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 :(得分:3)

预处理-

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]