【问题标题】:Assign mean values and/or conditional assignment for unordered duplicate dyads为无序重复 dyads 分配平均值和/或条件分配
【发布时间】:2018-12-07 17:36:41
【问题描述】:

我遇到了一些超出我技能的东西。我正在处理由国家间数据组成的 IMF 贸易数据。 IMF 数据集由“无序重复”记录组成,每个国家单独报告贸易数据。但是,由于时间、记录系统、制度类型等的不同,对应的数值存在差异。我试图以两种方式处理这些数据:

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

有几个关于识别无序重复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

可能不是所有的 dyads 都会出现两次,所以我收录了一张独奏唱片。我更喜欢data.table,但我会选择任何能让我走上正确道路的东西。

感谢您的宝贵时间。

【问题讨论】:

    标签: r dplyr data.table


    【解决方案1】:

    预处理:

    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],] 的第一个元素)将被指定为第一个记者的进口(因为它是第一个元素)。

    编辑:

    如果import和exports在输入数据中都是正数,并且需要在输出数据中为正数,那么上面的两个计算可以修改为

    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]
    

    【讨论】:

    • 获得分组的标准技巧是by = .(pmin(reporter, partner), pmax(reporter, partner)); + 您可以即时检查 .N 而无需预先计算
    • 这不是我的意思。 >
    • 哦,我明白了。我想也许我错过了 data.table 更新,.N 现在可以在 i 中使用
    • 你可以把它放在by 参数中。只需将其添加到前面作为by = .(year, pmin(reporter, partner), pmax(reporter, partner))]。我已经编辑了答案以添加它。
    • 看起来imf[, G := .GRP, by = .(pmin(reporter, partner), pmax(reporter, partner),year)] 有效。
    猜你喜欢
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    相关资源
    最近更新 更多