我正在尝试解决R中的以下问题。我有一个包含4列的数据框:currency_1_amt
,currency_1_denom
,currency_2_amt
,currency_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)
是否有更好的(例如矢量化)方式来完成我的任务?
答案 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])
我故意更改订单(第一个条件之前的第二个条件),所以如果满足第二个条件,那么同样满足第一个条件的条目也不会被覆盖。