Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 为无序重复二元分配平均值和/或条件分配_R_Dplyr_Data.table - Fatal编程技术网

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

R 为无序重复二元分配平均值和/或条件分配,r,dplyr,data.table,R,Dplyr,Data.table,我遇到了一些比我的技能稍高的东西。我正在处理国际货币基金组织的贸易数据,这些数据由国家之间的二元数据组成。国际货币基金组织的数据集由“无序重复”记录组成,每个国家单独报告贸易数据。然而,由于各种定时、记录系统、制度类型等,相应值之间存在差异。我试图用两种方式处理这些数据: 将平均值分配给重复的二元数 根据单独的经济指标或发展指数有条件地分配二元值(我更信任谁?) 关于识别无序的重复项,有好几次讨论,但经过几天的搜索,我还没有看到我要做什么 下面是一个原始数据的示例。实际上,还有更多的变量和几十万

我遇到了一些比我的技能稍高的东西。我正在处理国际货币基金组织的贸易数据,这些数据由国家之间的二元数据组成。国际货币基金组织的数据集由“无序重复”记录组成,每个国家单独报告贸易数据。然而,由于各种定时、记录系统、制度类型等,相应值之间存在差异。我试图用两种方式处理这些数据:

  • 将平均值分配给重复的二元数
  • 根据单独的经济指标或发展指数有条件地分配二元值(我更信任谁?)
  • 关于识别无序的重复项,有好几次讨论,但经过几天的搜索,我还没有看到我要做什么

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

    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
    
    目标2:

    有条件地分配较高的经济指标(
    代表经济1

    可能不是所有的二人组都有两次演出,所以我加入了一张独唱唱片。我更喜欢
    data.table
    ,但我会选择任何能引导我走上正确道路的东西

    感谢您抽出时间。

    预处理:

    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(手段)

    备选方案2(最高经济指标)

    imf[N==2
    ,c('import','export'):={
    
    o获得分组的标准技巧是通过=(pmin(reporter,partner),pmax(reporter,partner))
    ;+您可以动态检查.N而无需预先计算它。这不是我的意思。N,我的意思是使用
    if/else
    (可以说更麻烦)-如果你只想选择那些行以开始,你仍然需要预先计算它。哦,我明白了。我想可能我错过了一个
    数据。表
    更新和
    。N
    可以用在
    I
    中,现在你可以把它放在
    by
    参数中。只需将它添加到前面,作为
    by=(year,pmin(reporter,partner),pmax(报告者,合伙人)]
    。我编辑了答案以添加这一点。看起来
    imf[,G:=.GRP,by=(pmin(报告者,合伙人),pmax(报告者,合伙人),year)]
    有效。
     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
    
    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]
    
    # 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
    
    # 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
    
    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]