首页 > 解决方案 > FX 转换取决于 FX 交换(交叉 df 乘法)

问题描述

我正在使用以下数据,如下所示:(来自 quantmod 的财务数据)

# A tibble: 5 x 4
  symbol     year adjusted Total.Revenue
  <chr>     <int>    <dbl>         <dbl>
1 MSFT       2017   101.         9.66e10
2 5563.T     2017   307.         7.13e10
3 WB         2017    91.0        1.15e 9
4 0992.HK    2017     3.94       4.30e10
5 005930.KS  2017 45600.         2.40e14

# A tibble: 1 x 4
  date       jpy_usd hkd_usd  krw_usd
  <date>       <dbl>   <dbl>    <dbl>
1 2018-07-09 0.00904   0.127 0.000900

我想要做的是separatesymbol列中df1的所有内容.放入新列中。所以THKandKS会在新列下,如果后面没有字符,.则留一个空格或USD. 我尝试了以下方法,但运气不佳。

dftest <- df1 %>%
  separate(symbol, into = c("ticker", "country"),
           sep = "(?<=[A-Z])\\.(?=[a-z]+)", convert = TRUE)

然后我试图将df2数据相乘。jpy_usd对应Thkd_usd对应HKkrw_usd对应KS。然后将adjusted和乘以Total Revenue相应的汇率。创建的列separate将留空,因为它们已经是美元,所以应该没有兑换转换。

所以最后一些值应该是这样的:

5563.T - adjusted = 307*0.00904 = 2.77 0992.HK - Total.Revenue = 5461000000等等

我希望我清楚我想要做什么。如果可能的话,我会尝试在dplyr包装中进行。

资料一:

df1 <- structure(list(symbol = c("MSFT", "5563.T", "WB", "0992.HK", 
"005930.KS"), year = c(2017L, 2017L, 2017L, 2017L, 2017L), adjusted = c(101.459557, 
307, 90.970001, 3.945, 45600), Total.Revenue = c(9.6571e+10, 
7.1346e+10, 1150054000, 43034731000, 2.3958e+14)), .Names = c("symbol", 
"year", "adjusted", "Total.Revenue"), row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))

数据2:

df2 <- structure(list(date = structure(17721, class = "Date"), jpy_usd = 0.00904, 
    hkd_usd = 0.127416, krw_usd = 9e-04), row.names = c(NA, -1L
), class = c("tbl_df", "tbl", "data.frame"), .Names = c("date", 
"jpy_usd", "hkd_usd", "krw_usd"))

标签: rdplyr

解决方案


回答第 1 部分,

dftest <- df1 %>% 
  separate(symbol, into = c("ticker", "country"), 
  sep = "[.]", convert = TRUE)

结果是

# A tibble: 5 x 5
  ticker country  year adjusted Total.Revenue
  <chr>  <chr>   <int>    <dbl>         <dbl>
1 MSFT   NA       2017   101.         9.66e10
2 5563   T        2017   307          7.13e10
3 WB     NA       2017    91.0        1.15e 9
4 0992   HK       2017     3.94       4.30e10
5 005930 KS       2017 45600          2.40e14

回答第 2 部分

它有点难看......但是工作

dffinal <- dftest %>% 
  mutate(exchange.rates = ifelse(country == "T", df2$jpy_usd, 
ifelse(country == "HK", df2$hkd_usd, ifelse(country == "KS", 
df2$krw_usd, 0)))) %>% 
  mutate(exchange.rates = ifelse(is.na(country), 1, exchange.rates))%>% 
  mutate(adjusted = adjusted * exchange.rates) %>% 
  mutate(Total.Revenue = Total.Revenue * exchange.rates)

结果是

    # A tibble: 5 x 6
  ticker country  year adjusted Total.Revenue exchange.rates
  <chr>  <chr>   <int>    <dbl>         <dbl>          <dbl>
1 MSFT   NA       2017  101.     96571000000         1      
2 5563   T        2017    2.78     644967840         0.00904
3 WB     NA       2017   91.0     1150054000         1      
4 0992   HK       2017    0.503   5483313285.        0.127  
5 005930 KS       2017   41.0   215622000000         0.0009 

推荐阅读