从R中的多种货币转换为欧元

从R中的多种货币转换为欧元,r,currency-exchange-rates,pricer,R,Currency Exchange Rates,Pricer,我有以下数据帧: structure(list(currency = c("NZD", "NZD", "NZD", "NZD", "NZD", "EUR", "SEK", "EUR"), price = c(580.9, 539.75, 567.8, 802, 486, 365, 5088, 111)), class = "

我有以下数据帧:

structure(list(currency = c("NZD", "NZD", "NZD", "NZD", "NZD", 
"EUR", "SEK", "EUR"), price = c(580.9, 539.75, 567.8, 
802, 486, 365, 5088, 111)), class = "data.frame")
我想添加一个新栏,栏中的“价格”以欧元表示,取2019年的平均汇率

我已经安装了priceR软件包并测试了以下功能,但它不允许从多种货币转换

historical_exchange_rates("NZD", to = "USD",
                          start_date = "2019-01-01", end_date = "2019-12-31")
添加2019年欧元平均价格的新栏有什么优雅的方式

输出应如下所示:

 currency            price        price_euro
      NZD            380.86       500
      SEK            531.75       800
########编辑#####

我设法用货币创建了这个df,然后将其加入我的主df。 我想知道是否有更优雅的解决方案

#include currencies
currency <- unique(mydf$currency)
#Loop over each of them
currency_df <- do.call(cbind, lapply(currency, function(x) {
    historical_exchange_rates(currency, to = "EUR",
                              start_date = "2019-01-01", end_date = "2019-12-31")}))
#remove duplicated columns (date)
currency_df <- currency_df[, !duplicated(colnames(currency_df), fromLast = TRUE)] 

#clean the currency df
currency_df <- currency_df %>% 
    #gets the average of all numeric columns
    summarise_if(is.numeric, mean, na.rm =TRUE) %>% 
    #reshape from wide to long
    pivot_longer(cols = starts_with("one_")) %>% 
    #extract currency name to link to main table  
     mutate(currency = gsub(".*one_(.*)_equivalent.*","\\1",name))
具有平均值和重塑值的货币

structure(list(name = c("one_NZD_equivalent_to_x_EUR", "one_KES_equivalent_to_x_EUR", 
"one_USD_equivalent_to_x_EUR", "one_AED_equivalent_to_x_EUR", 
"one_EUR_equivalent_to_x_EUR", "one_CHF_equivalent_to_x_EUR", 
"one_SEK_equivalent_to_x_EUR", "one_NOK_equivalent_to_x_EUR", 
"one_DKK_equivalent_to_x_EUR", "one_TRY_equivalent_to_x_EUR", 
"one_CZK_equivalent_to_x_EUR", "one_PLN_equivalent_to_x_EUR", 
"one_ZAR_equivalent_to_x_EUR", "one_GBP_equivalent_to_x_EUR", 
"one_HKD_equivalent_to_x_EUR", "one_SGD_equivalent_to_x_EUR", 
"one_INR_equivalent_to_x_EUR", "one_AUD_equivalent_to_x_EUR", 
"one_AOA_equivalent_to_x_EUR"), value = c(0.588651219178082, 
0.0930875424657534, 0.89324564109589, 0.307407216438356, 1, 0.89912858630137, 
0.0945236684931507, 0.101572109589041, 0.133948753424658, 0.157569854794521, 
0.0389822712328767, 0.232789550684932, 0.0618727479452055, 1.14057644657534, 
0.11402897260274, 0.654955421917808, 0.0127049808219178, 0.620929498630137, 
1), currency = c("NZD", "KES", "USD", "AED", "EUR", "CHF", "SEK", 
"NOK", "DKK", "TRY", "CZK", "PLN", "ZAR", "GBP", "HKD", "SGD", 
"INR", "AUD", "AOA")), row.names = c(NA, -19L), class = c("tbl_df", 
"tbl", "data.frame"))

如果我理解您的问题,您只需要在现有数据集中添加一列,其中包含以欧元表示的价格。我认为您加入数据集的想法是正确的,但由于您提供的函数格式的方式,因此只有一些丑陋的东西需要处理。我还认为您希望有一种方法可以将其推广到更大的类似结构的数据集,因此最好将其功能化

我相信有一种更有效的方法,但对于像我这样的爱整洁的人来说,这是可行的

library(priceR);library(tidyverse)

#Data frame
df <- data.frame(
  currency = c("NZD", "NZD", "NZD", "NZD", "NZD", "EUR", "SEK", "EUR"),
  price = c(580.9, 539.75, 567.8, 802, 486, 365, 5088, 111)
)

#Function to pull conversions
avg_ex <- function(x){
  historical_exchange_rates(x, to = "EUR",start_date = "2019-01-01", end_date = "2019-12-31") %>%
    `colnames<-`(c('date','conv')) %>% summarise(mean(conv)) %>% as.numeric
}

#Apply across all needed
conversions = sapply(unique(df$currency),avg_ex) %>% data.frame() %>% rownames_to_column() %>%
  `colnames<-`(c('currency','conv'))

#Join and convert
df %>% left_join(conversions,by='currency') %>%
  mutate(price_euro = price*conv)

如果我理解您的问题,您只需要在现有数据集中添加一列,其中包含以欧元表示的价格。我认为您加入数据集的想法是正确的,但由于您提供的函数格式的方式,因此只有一些丑陋的东西需要处理。我还认为您希望有一种方法可以将其推广到更大的类似结构的数据集,因此最好将其功能化

我相信有一种更有效的方法,但对于像我这样的爱整洁的人来说,这是可行的

library(priceR);library(tidyverse)

#Data frame
df <- data.frame(
  currency = c("NZD", "NZD", "NZD", "NZD", "NZD", "EUR", "SEK", "EUR"),
  price = c(580.9, 539.75, 567.8, 802, 486, 365, 5088, 111)
)

#Function to pull conversions
avg_ex <- function(x){
  historical_exchange_rates(x, to = "EUR",start_date = "2019-01-01", end_date = "2019-12-31") %>%
    `colnames<-`(c('date','conv')) %>% summarise(mean(conv)) %>% as.numeric
}

#Apply across all needed
conversions = sapply(unique(df$currency),avg_ex) %>% data.frame() %>% rownames_to_column() %>%
  `colnames<-`(c('currency','conv'))

#Join and convert
df %>% left_join(conversions,by='currency') %>%
  mutate(price_euro = price*conv)

我认为您已经有了一个解决方案,但如果它有用的话,这里有一个方便的方法来生成具有多种货币的数据帧:

库(价格)
图书馆(tidyverse)

nz_to_us我认为您已经有了一个解决方案,但如果它有用的话,这里有一个方便的方法来生成具有多种货币的数据帧:

库(价格)
图书馆(tidyverse)

新西兰到美国你能在货币上的for循环中使用历史汇率函数吗?
历史汇率
返回什么?您可以使用该输出。历史汇率返回一个df,其中包含所提供期间的日期和汇率。我创建了2019年的平均df。我希望有一个更简单的解决方案。你能用你提供的上一个表和df将df与2019年的平均值包括在一起吗?380.86如何变成500,531.75如何变成800?你能在货币上的一个for循环中使用历史汇率函数吗?
历史汇率
返回什么?您可以使用该输出。历史汇率返回一个df,其中包含所提供期间的日期和汇率。我创建了2019年的平均df。我希望有一个更简单的解决方案。你能用你提供的上一个表和df将df与2019年的平均值包括在内吗?380.86如何变成500,531.75如何变成800??
  currency   price       conv price_euro
1      NZD  580.90 0.58865122   341.9475
2      NZD  539.75 0.58865122   317.7245
3      NZD  567.80 0.58865122   334.2362
4      NZD  802.00 0.58865122   472.0983
5      NZD  486.00 0.58865122   286.0845
6      EUR  365.00 1.00000000   365.0000
7      SEK 5088.00 0.09452367   480.9364
8      EUR  111.00 1.00000000   111.0000