如何根据另一个数据帧对一个数据帧执行操作?

时间:2018-10-23 09:21:38

标签: r dataframe

我有一个名为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

3 个答案:

答案 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