使用 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
我正在尝试使用 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