我遇到了一些超出我的技能范围的事情。我正在使用由国家二元组之间的数据组成的IMF贸易数据。 IMF数据集由“无序重复”记录组成,每个国家单独报告贸易数据。但是,由于各种定时,记录系统,状态类型等,相应值之间存在差异。我正在尝试以两种方式处理此数据:
将平均值分配给重复的二元组。
根据单独的经济指标或发展指数(我对谁更信任?)有条件地分配对偶值。
关于标识无序重复的here,here,here和here的讨论很多,但是经过几天的搜索,我还没有看到我要做什么。
这是原始数据的示例。实际上,还有更多的变量和数十万个二元组:
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
,但我会尽一切努力引导我走上正确的道路。感谢您的时间。
最佳答案
预处理:
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]