r - 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
我想要做的是separate
将symbol
列中df1
的所有内容.
放入新列中。所以T
,HK
andKS
会在新列下,如果后面没有字符,.
则留一个空格或USD
. 我尝试了以下方法,但运气不佳。
dftest <- df1 %>%
separate(symbol, into = c("ticker", "country"),
sep = "(?<=[A-Z])\\.(?=[a-z]+)", convert = TRUE)
然后我试图将df2
数据相乘。jpy_usd
对应T
,hkd_usd
对应HK
,krw_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"))
解决方案
回答第 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
推荐阅读
- c# - unity Internal_xxx 函数
- node.js - 更改 ip Nodejs
- sql - SQL Oracle - 多处理器调度:贪心数分区
- c++ - std::stringstream 不使用格式错误的整数设置故障位
- python - 如何与 Cylon BMS 控制器通信
- javascript - 当我克隆多个下拉列表时如何在jQuery中获取多个下拉列表值
- javascript - (discord.js)如果我输入`>clear 1`,它会清除 100 条消息而不是 1 条,如果我输入`>c @user 1`,它会起作用并且只清除 1 条消息
- php - PHP 和 MYSQL 连接错误
- c - sa_mask 默认值为空吗?
- python - 如何使用 Linux Shell 脚本和 Python 脚本插入空行?