我有一个名为df
的数据框,我要在该数据框上转换某些列中的欧元金额(由变量$ currency.Code提供)。为此,我得到了另一个名为taux_change_vers_EUR
的数据框,其中包含两个变量:(1)货币名称,(2)转换为欧元的汇率。
我想将数据帧taux_change_vers_EUR
的第二列的系数应用于数据帧df
的几列。问题是我的df很大,因此必须优化操作(也不用于循环)。你有想法吗?
这是代码的一部分。该代码不起作用,但确实显示了您的期望:
for (devise in unique(df$currency.Code)){
df[df$currency.Code==devise,c(4:37,44:48)] <- df[df$currency.Code==devise,c(4:37,44:48)]*rep(as.numeric(taux_change_vers_EU R[taux_change_vers_EUR[,1]==devise,2]),39)
}
这是我的第二个数据帧的样子:
taux_change_vers_EUR
V1 V2
1 USD 1.14720
2 CAD 1.48836
3 GBP 0.87869
4 EUR 1.00000
5 <NA> 1.00000
6 DKK 6.50221
7 SEK 9.10235
8 PLN 3.76455
9 CZK 22.49280
10 NOK 8.28273
11 TRY 6.12973
12 TWD 30.98320
13 CNY 6.92256
14 HKD 7.83296
15 JPY 113.16000
答案 0 :(得分:1)
您应该能够按实际货币合并两个data.frame
,然后进行转换。以下是使用dplyr
的可复制示例。
library(dplyr)
# create dummy data
currencies <- data.frame(
currency = c("USD", "GBP", "JPY", "CAD"),
rate = c(1.2, .9, .8, 1.5)
)
moneyz <- data.frame(
value = runif(100, 5, 100),
currency = sample(currencies$currency, 100, replace = TRUE)
)
# merge and convert
moneyz %>%
left_join(currencies, by = "currency") %>% # merge
mutate(
converted = value * rate # convert
)
我们只需将两个表合并在一起,就可以得到一个表,其中包含其值,所使用的货币和可转换为EUR的适当汇率。
答案 1 :(得分:1)
我们可以使用 match :
# example data borrowed from @JohnCoene
df1 <- data.frame(
currency = c("USD", "GBP", "JPY", "CAD"),
rate = c(1.2, 0.9, 0.8, 1.5))
set.seed(1); df2 <- data.frame(
value = 1,
currency = sample(df1$currency, 5, replace = TRUE))
df2$velueNew <- df2$value * df1$rate[ match(df2$currency, df1$currency) ]
df2
# value currency velueNew
# 1 1 GBP 0.9
# 2 1 GBP 0.9
# 3 1 JPY 0.8
# 4 1 CAD 1.5
# 5 1 USD 1.2
答案 2 :(得分:0)
我创建了一个示例,您可以通过运行以下示例来重用它:
df <- structure(list(c("EUR", "EUR", "USD", "CAD"), c(1654, 68797,
6546, 736), c("CNY", "HKD", "HKD", "HKD"), c(6876, 63, 687, 354
)), .Names = c("currency1", "amount1", "currency2", "amount2"
), class = "data.frame", row.names = c(NA, -4L))
一种快速的方法,假设您在taux_change_vers_EUR
中拥有唯一的货币,则对{{1} },甚至可以循环浏览。
merge