2017-10-11 62 views
3

我來自Stata的R,有一個簡單的語法問題,我一直無法解決。我試圖循環多種貨幣(GBP EUR JPY)進行匯率調整。對於以上列貨幣計價的每個記錄,設置「amount_usd」等於「金額」除以匯率(USDGBP,USDEUR,USDJPY)。for循環的語法在R

創建數據:

df <- data.frame(currency = c("GBP", "GBP", "EUR", "EUR", "JPY"), 
       amount = c(100, 200, 100, 200, 100), 
       USDGBP = c(1.5, 1.5, 1.5, 1.5, 1.5), 
       USDEUR = c(1.1, 1.1, 1.1, 1.1, 1.1), 
       USDJPY = c(100, 100, 100, 100, 100)) 

df$amount_usd <- df$amount 

我試過下面環路各種版本的,但沒有任何運氣。我會很欣賞(1)適當循環語法的指針,以及(2)使代碼更優雅的技巧。

df$face_value_curr_usd <- df$face_value_curr 

for (curr in c("GBP", "EUR", "JPY")) { 
    if (df[,which(colnames(df) == "currency")] == curr) { 
     df[,which(colnames(df) == "amount_usd")] <- 
      df[, which(colnames(df) == "amount")]/df[,which(colnames(df) == c("USD",curr))] 
    } 
    else { 
    } 
} 

得到的DF $ amount_usd應採取的值:

c(66.67, 133.33, 90.91, 181.82, 1) 
+1

請粘貼'dput(head(df))'的結果 – dww

+1

可重現的例子和所需的輸出將會很有用。 – Cris

+0

預期產量也需要 – dww

回答

4

你真正想要的是什麼矢量操作,而不是循環。這個想法是使用行索引對要修改的數據部分進行子集劃分,然後在其上進行所有計算。

首先,您不需要以數字方式引用列。取而代之的

df[,which(colnames(df) == "currency")] 

你可以使用

df[, "currency"] 

,或者它與$運營商別名

df$currency 

您可以使用向量來確定哪些數據幀的行匹配給定值

gbp_rows <- df$currency == "GBP" 

,你可以使用指定新值,只有那些行,像

df$face_value_curr_usd[gbp_rows] <- df$amount[gbp_rows]/df$fxGBP[gbp_rows] 

雖然我認爲fxGBP是恆定的,對不對?所以也許這樣的事情會做?

df$face_value_curr_usd[gbp_rows] <- df$amount[gbp_rows]/fxGBP 

由於進行了報道,你的問題的可重複的版本將是有益的,我不知道這是什麼,你正在嘗試做的。

編輯:我說的和克里斯的回答的組合,現在我們有一個df

df <- data.frame(currency = c("GBP", "GBP", "EUR", "EUR", "JPY"), 
       amount = c(100, 200, 100, 200, 100), 
       USDGBP = c(1.5, 1.5, 1.5, 1.5, 1.5), 
       USDEUR = c(1.1, 1.1, 1.1, 1.1, 1.1), 
       USDJPY = c(100, 100, 100, 100, 100)) 

for(curr in unique(df$currency)) { 
    this_curr_rows <- df$currency == curr 
    df$amount_usd[this_curr_rows] <- df$amount[this_curr_rows]/df[this_curr_rows, paste0("USD", curr)] 
} 
+1

感謝Brian,該解決方案適用於一種貨幣。我最關心的是我想爲所有貨幣執行相同的一組命令。如果我想爲多種貨幣生成「gbp_rows」向量,Stata語法就類似於:「foreb curr in gbp eur jpy {gen'curr'_gbp =(currency ==」'curr'「)}」。我會如何類似地引用R語法中的循環項? –

3

使用此數據:

df <- data.frame(currency = c("GBP", "GBP", "EUR", "EUR", "JPY"), 
       amount = c(100, 200, 100, 200, 100), 
       USDGBP = c(1.5, 1.5, 1.5, 1.5, 1.5), 
       USDEUR = c(1.1, 1.1, 1.1, 1.1, 1.1), 
       USDJPY = c(100, 100, 100, 100, 100)) 

你可以這樣做:

for(curr in unique(df$currency)){ 
    df[paste("amount_usd",curr,sep="-")]=df$amount/df[paste("USD",curr, sep="")] 
} 

產生這種結果的產品:

currency amount USDGBP USDEUR USDJPY amount_usd-GBP amount_usd-EUR amount_usd-JPY 
GBP 100 1.5 1.1 100 66.7 90.9 1 
GBP 200 1.5 1.1 100 133.3 181.8 2 
EUR 100 1.5 1.1 100 66.7 90.9 1 
EUR 200 1.5 1.1 100 133.3 181.8 2 
JPY 100 1.5 1.1 100 66.7 90.9 1 

因此,它爲您提供所有貨幣的匯率調整。 希望它有幫助。

+0

啊,非常優雅!是否有一種簡單的方法將結果輸出合併到一個變量中,而不是單個貨幣中? –

+1

'df $ amount_usd < - df $ amount/df [paste0(「USD」,curr)]' –

+0

該方法每次都會重寫df $ amount_usd。有其他選擇嗎? –