Умножение столбцов из разных фреймов данных с разной длиной и двумя условиями в R

У меня есть два фрейма данных разной длины. Я хочу изменить столбцы во фрейме данных df, умножив CAP * currency и Go * currency из df_cur . Это должно быть выполнено с соблюдением условий, согласно которым страна и год должны быть одинаковыми для двух названий данных соответственно. В частности,

#df#

Country Sector Year Cap Go Exposion
AUS A 2000 100 200 0.2
AUS B 2000 150 200 0.3
AUS C 2000 160 160 0.25
AUS A 2001 110 200 0.25
AUS B 2001 140 190 0.4
AUS C 2001 165 155 0.2
BEL A 2000 50 150 0.1
BEL B 2000 70 160 0.15
BEL C 2000 100 200 0.2
BEL A 2001 55 160 0.15
BEL B 2001 65 140 0.1
BEL C 2001 110 190 0.3

# df_cur #

country year currency
AUS 2000 0.58
AUS 2001 0.60
BEL 2000 0.92
BEL 2001 0.95

Итак, я хочу преобразовать df как:

#df#

Country Sector Year Cap Go Exposion
AUS A 2000 100*0.58 200*0.58 0.2
AUS B 2000 150*0.58 300*0.58 0.3
AUS C 2000 160*0.58 160*0.58 0.25
AUS A 2001 110*0.6 200*0.6 0.25
AUS B 2001 140*0.6 190*0.6 0.4
AUS C 2001 165*0.6 155*0.6 0.2
BEL A 2000 50*0.92 150*0.92 0.1
BEL B 2000 70*0.92 160*0.92 0.15
BEL C 2000 100*0.92 200*0.92 0.2
BEL A 2001 55*0.95 160*0.95 0.15
BEL B 2001 65*0.95 140*0.95 0.1
BEL 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)

Большое спасибо за уделенное время!


person Panagiotis Zontiros    schedule 25.04.2021    source источник


Ответы (2)


Добро пожаловать, Панайотис! Самый простой - сначала объединить два data.frames. Затем на втором шаге вы можете создать новые столбцы с mutate():

library(dplyr)

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

person mharinga    schedule 25.04.2021

Использование 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
person akrun    schedule 25.04.2021