基于向量C或D的值从向量A或B返回元素

时间:2015-06-17 13:33:37

标签: r vectorization

我正在尝试解决R中的以下问题。我有一个包含4列的数据框:currency_1_amtcurrency_1_denomcurrency_2_amtcurrency_2_denom。以下是此表中的几行

|----------------|------------------|----------------|------------------|
| currency_1_amt | currency_1_denom | currency_2_amt | currency_2_denom |
|----------------|------------------|----------------|------------------|
| 100            | USD              | 620            | CNY              |
| 500            | CNY              | 80.55          | USD              |
| 80.55          | INR              | 1              | USD              |
| 100            | INR              | 9.67           | CNY              |

我正在尝试为每一行计算一个名义值:

  • 如果currency_1_denom == "USD"notional value=currency_1_amt

  • 如果currency_2_denom == "USD"notional value=currency_2_amt

  • 如果currency_1_denom == "USD"currency_1_denom == "USD"都没有notional_value = currency_1_amt * exchange_rate_of_currency_1_to_USD(我在数据框中有另一列具有相关汇率。

我不知道如何在R中执行此操作而不循环遍历每一行。 Heer是我想到的一些伪R代码

result = numeric(length(df))
for(j in 1:length(df)) {
    if(df[j,"currency_1_denom"] == "USD")
        result[j] = currency_1_amt
   else if(df[j,"currency_2_denom"] == "USD")
       result[j] = currency_2_amt
   else
       result[j] = currency_1_amt * lookup_exchange_rate(currency_1_denom)

是否有更好的(例如矢量化)方式来完成我的任务?

2 个答案:

答案 0 :(得分:3)

重新创建数据:

df<- read.table(text ="currency_1_amt currency_1_denom currency_2_amt  currency_2_denom
100            USD              620             CNY            
500            CNY              80.55           USD            
80.55          INR              1               USD            
100            INR              9.67            CNY",
           header = TRUE, stringsAsFactors = FALSE)

创建样本汇率只是为了运行示例:

df$exchange_rate_of_currency_1_to_USD <- 1:4

使用ifelse

df$notional_value <- with(df, ifelse(currency_1_denom == "USD", currency_1_amt, 
                                     ifelse(currency_2_denom == "USD", currency_2_amt,
                                            currency_1_amt * exchange_rate_of_currency_1_to_USD)))

答案 1 :(得分:1)

我会这样做:

second <- df$currency_2_denom == "USD"
df$national_value[second] <- df$currency_2_amt[second]
first <- df$currency_1_denom == "USD"
df$national_value[first] <- df$currency_1_amt[first]
third <- (df$currency_1_denom != "USD") & (df$currency_2_denom != "USD")
df$national_value[third] <- df$currency_1_amt[third]*lookup_exchange_rate(currency_1_denom[third])

我故意更改订单(第一个条件之前的第二个条件),所以如果满足第二个条件,那么同样满足第一个条件的条目也不会被覆盖。