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]