1

我有两个不同长度的数据框。我想用df_cur中的CAP * currencyGo * currency的乘法来改变数据框df中的列。这应该在两个数据名的国家和年份必须相同的条件下完成。进一步来说,

#df#

国家 部门 曝光
澳大利亚 一个 2000 100 200 0.2
澳大利亚 2000 150 200 0.3
澳大利亚 C 2000 160 160 0.25
澳大利亚 一个 2001年 110 200 0.25
澳大利亚 2001年 140 190 0.4
澳大利亚 C 2001年 165 155 0.2
贝尔 一个 2000 50 150 0.1
贝尔 2000 70 160 0.15
贝尔 C 2000 100 200 0.2
贝尔 一个 2001年 55 160 0.15
贝尔 2001年 65 140 0.1
贝尔 C 2001年 110 190 0.3

#df_cur#

国家 货币
澳大利亚 2000 0.58
澳大利亚 2001年 0.60
贝尔 2000 0.92
贝尔 2001年 0.95

所以,我想像这样转换 df :

#df#

国家 部门 曝光
澳大利亚 一个 2000 100*0.58 200*0.58 0.2
澳大利亚 2000 150*0.58 300*0.58 0.3
澳大利亚 C 2000 160*0.58 160*0.58 0.25
澳大利亚 一个 2001年 110*0.6 200*0.6 0.25
澳大利亚 2001年 140*0.6 190*0.6 0.4
澳大利亚 C 2001年 165*0.6 155*0.6 0.2
贝尔 一个 2000 50*0.92 150*0.92 0.1
贝尔 2000 70*0.92 160*0.92 0.15
贝尔 C 2000 100*0.92 200*0.92 0.2
贝尔 一个 2001年 55*0.95 160*0.95 0.15
贝尔 2001年 65*0.95 140*0.95 0.1
贝尔 C 2001年 110*0.95 190*0.95 0.3

我从2 个数据帧的不同大小的乘列中查看了许多答案,但对我没有任何帮助。

我的代码示例:

Country<-c("AUS","AUS","AUS","AUS","AUS","AUS", "BEL", "BEL", "BEL", "BEL", "BEL", "BEL")
Sector<-c("A","B","C","A","B","C","A","B","C","A","B","C")
Year<-c("2000", "2000", "2000", "2001", "2001", "2001", "2000", "2000", "2000", "2001", "2001", "2001")
Cap<-c(100,150,160,110,140,165,50,70,100,55,65,110)
Go<-c(200,200,160,200,190,155,150,160,200,160,140,190)
Exposion<-c(0.2,0.3,0.25,0.25,0.4,0.2,0.1,0.15,0.2,0.15,0.1,0.3)
df<-data.frame(Country,Sector,Year,Cap,Go,Exposion)

country<-c("AUS","AUS", "BEL", "BEL")
Year<-c("200","2001","2000","2001")
currency<-c(0.58, 0.6, 0.92, 0.95)
df_cur<-data.frame(country,Year,currency)

非常感谢您的宝贵时间!

4

2 回答 2

1

欢迎帕纳吉奥蒂斯!最简单的方法是先将两个 data.frames 组合起来。然后在第二步中,您可以使用以下命令创建新列mutate()

library(dplyr)

df %>%
  left_join(., df_cur) %>%
  mutate(cap2 = Cap * currency) %>%
  mutate(go2 = Go * currency)

于 2021-04-25T17:18:29.923 回答
0

使用data.table

library(data.table)
setDT(df)[df_cur, c("Cap", "Go") := 
     .(Cap * currency, Go * currency), on = .(Country = country, Year)]

-输出

df
#    Country Sector Year    Cap    Go Exposion
# 1:     AUS      A 2000 100.00 200.0     0.20
# 2:     AUS      B 2000 150.00 200.0     0.30
# 3:     AUS      C 2000 160.00 160.0     0.25
# 4:     AUS      A 2001  66.00 120.0     0.25
# 5:     AUS      B 2001  84.00 114.0     0.40
# 6:     AUS      C 2001  99.00  93.0     0.20
# 7:     BEL      A 2000  46.00 138.0     0.10
# 8:     BEL      B 2000  64.40 147.2     0.15
# 9:     BEL      C 2000  92.00 184.0     0.20
#10:     BEL      A 2001  52.25 152.0     0.15
#11:     BEL      B 2001  61.75 133.0     0.10
#12:     BEL      C 2001 104.50 180.5     0.30
于 2021-04-25T17:46:26.227 回答