r - 有条件地乘以向量(货币换算)

标签 r vector conditional currency

我有一个相当大的dataframe,其中变量以本地年度货币计价(在下面的示例中,澳大利亚和奥地利货币):

 Country   Var  _1995       _1996         _1997      _1998
     AUS    GO  1 014 828   1 059 326     1 119 101  1 194 995
     AUS    L   36 873      38 895        39 502     40 425
     AUS    K   41 498      45 008        48 683     47 252
     AUT    GO  289 923     299 487       309 734    323 273
     AUT    GO  8 032       7 849         8 049      7 815
     AUT    L   1 094       1 151         1 163      1 152
     AUT    K   12 032      11 760        11 743     11 611

我想使用这些乘数将此数据框中的值转换为 1995 美元:

Country   _1995     _1996     _1997  _1998 
AUS      0,7415   0,78295   0,74406  0,6294
AUT     1,36646   1,30031   1,12904 1,11319

因此,对于表 1 中包含变量 AUS 的每一行,每年的值乘以表 2 中包含 AUS 的行中的适当 $1995 乘数。这同样适用于包含 AUT 的每一行,作为我的数据框中的其他 38 个国家/地区代码。

因此,在第一行我希望 R 执行此计算:

 Country Var    _1995            _1996            _1997           _1998        
    AUS  GO  1014828*0,7415 1059326*0,78295   1119101*0,74406 1194995*0,6294 

等等。这可行吗?帮助非常感谢!

最佳答案

我建议从宽格式 reshape 为长格式,这将大大简化此操作。 reshape 是最复杂的部分。我在这里使用示例数据和 reshape 命令展示它,但您也可以使用 dplyrreshape2 或其他任何东西。

基本上,将两个数据集重新整形为长数据集,然后合并它们,执行乘法(在长格式中,只是简单的向量乘法),然后重新整形为宽数据集。

这是示例数据(类似于您的数据):

set.seed(1)
dat <- data.frame(Country = rep(c("AUS", "AUT"), each = 3), 
                  Var = rep(c("GO", "L", "K"), times = 2), 
                  v_1996 = rnorm(6), v_1997 = rnorm(6), v_1998 = rnorm(6),  
                  stringsAsFactors = FALSE)

multipliers <- data.frame(Country = c("AUS", "AUT"), 
                          v_1995 = c(0.7415, 1.36646),
                          v_1996 = c(0.78295, 1.30031),
                          v_1997 = c(0.74406, 1.12904),
                          v_1998 = c(0.6294, 1.11319), stringsAsFactors = FALSE)

下面是进行转换的代码:

long <- reshape(dat, times = 1996:1998, v.names = "Value", 
                varying = c("v_1996", "v_1997", "v_1998"), 
                direction = "long")
head(long, 3)
#        Country Var time      Value id
# 1.1996     AUS  GO 1996 -0.6264538  1
# 2.1996     AUS   L 1996  0.1836433  2
# 3.1996     AUS   K 1996 -0.8356286  3
# 4.1996     AUT  GO 1996  1.5952808  4

mlong <- reshape(multipliers, times = 1995:1998, v.names = "mult", 
                 varying = c("v_1995","v_1996", "v_1997", "v_1998"), 
                 direction = "long")
head(mlong, 3)
#        Country time    mult id
# 1.1995     AUS 1995 0.74150  1
# 2.1995     AUT 1995 1.36646  2
# 1.1996     AUS 1996 0.78295  1

merged <- merge(long, mlong, by = c("Country", "time"))
merged$converted <- merged$Value * merged$mult    
head(merged, 3)
#   Country time Var      Value id.x    mult id.y  converted
# 1     AUS 1996  GO -0.6264538    1 0.78295    1 -0.4904820
# 2     AUS 1996   L  0.1836433    2 0.78295    1  0.1437835
# 3     AUS 1996   K -0.8356286    3 0.78295    1 -0.6542554

reshape(merged, idvar = c("Country", "Var"), direction = "wide", 
        drop = c("id.x", "id.y","mult"))
#    Country Var Value.1996 converted.1996 Value.1997 converted.1997  Value.1998 converted.1998
# 1      AUS  GO -0.6264538     -0.4904820  0.4874291      0.3626765 -0.62124058    -0.39100882
# 2      AUS   L  0.1836433      0.1437835  0.7383247      0.5493579 -2.21469989    -1.39393211
# 3      AUS   K -0.8356286     -0.6542554  0.5757814      0.4284159  1.12493092     0.70803152
# 10     AUT  GO  1.5952808      2.0743596 -0.3053884     -0.3447957 -0.04493361    -0.05001964
# 11     AUT   L  0.3295078      0.4284623  1.5117812      1.7068614 -0.01619026    -0.01802284
# 12     AUT   K -0.8204684     -1.0668632  0.3898432      0.4401486  0.94383621     1.05066903

关于r - 有条件地乘以向量(货币换算),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29166637/

相关文章:

c++ - 稀疏 x 密集矩阵与 Armadillo 相乘出乎意料地慢

c++ - 将 vector 作为参数传递并使用它,为什么会崩溃?

if-statement - Prolog,带有条件条款的建筑 list

clojure - 实现 Clojure 条件/分支转换器

function - 试图将 col.name 附加到向量上

r - 添加两个列表的所有元素

r - 在 MacOS Catalina 上安装多个 R 版本(版本 10.15.2)

vector - 从旧 Vector 创建新 Vector?

c++ - std::vector::erase 删除最后一个元素而不是第一个

R,有条件地删除重复的行