使用 if 函数跨两个表执行计算 - Rstudio

Using if functions to perform calculations across two tables - Rstudio

我正在尝试使用 if 函数(除非有更好的方法!)将欧元和美元金额转换为英镑。我有两个table,一个是货币兑换率,一个是人们的假期消费。

假日消费

Date<- c('01/01/2021', '02/01/2021','01/01/2021', '02/01/2021','01/01/2021', '02/01/2021','01/01/2021', '02/01/2021' )
Person <- c('Person A', 'Person B', 'Person C', 'Person A', 'Person B', 'Person C', 'Person A', 'Person B')
Amount <- c('100',  '150',  '200',  '250',  '300',  '350',  '400',  '450')
Currency <- c('GBP',    'EUR',  'USD',  'GBP',  'GBP',  'GBP',  'EUR',  'USD')

DF <- data.frame(Date, Person, Currency, Amount) 

对话率

Date<- c('01/01/2021', '01/01/2021','02/01/2021', '02/01/2021','03/01/2021', '03/01/2021','04/01/2021', '04/01/2021' )
Country <- c('EUR', 'USD',  'EUR',  'USD',  'EUR',  'USD',  'EUR',  'USD')
Rate <- c('2',  '4',    '6',    '8',    '10',   '12',   '14',   '16')


XR <- data.frame(Date, Country, Rate)

我要做的是搜索假期消费的货币列表,如果货币列显示的不是英镑,则找到当天的货币兑换率并重新计算金额列.

例如,B 人在 2021 年 2 月 10 日花费了 150 欧元,当天的通话率为 6,那么 150 应该重新计算为 900,我不需要将货币列更改为当我稍后在过程中重新调整 tables 时,它无论如何都会被过滤掉。

我可以在 excel 中使用 vlookup 和 if 函数来做到这一点,但我正在努力将其转换为 R。在 Excel 中,我在不同的选项卡上显示了欧盟和美元汇率但在 R 中它是一个大 table。我可以将它分成小 tables 但仍然不确定如何让 if 和 sum 以 R 格式工作。

Excel 函数

=IF(D2="EUR",SUM(E2 * VLOOKUP(A2,EU!A:D,3,FALSE)),IF(D2="USD",SUM(E2* VLOOKUP(A2,USD!A:D,3,FALSE)),Spending!E2))

感谢您的建议。

您可以执行联接并将费率乘以金额。

library(dplyr)

DF %>%
  left_join(XR, by = c('Date', 'Currency' = 'Country')) %>%
  mutate(New_Amount = as.numeric(Amount) * as.numeric(Rate), 
         New_Amount = coalesce(New_Amount, as.numeric(Amount)))

#        Date   Person Currency Amount Rate New_Amount
#1 01/01/2021 Person A      GBP    100 <NA>        100
#2 02/01/2021 Person B      EUR    150    6        900
#3 01/01/2021 Person C      USD    200    4        800
#4 02/01/2021 Person A      GBP    250 <NA>        250
#5 01/01/2021 Person B      GBP    300 <NA>        300
#6 02/01/2021 Person C      GBP    350 <NA>        350
#7 01/01/2021 Person A      EUR    400    2        800
#8 02/01/2021 Person B      USD    450    8       3600