2013-06-27 37 views
4

我有日期的對和Currenyr使用函數來使用值作爲參數數據幀的行

Date   Currency  ExchangeRate 
2012-08-13  EUR   ? 
2012-08-13  CHF   ? 
2012-08-13  CZK   ? 

一個DF TRX我有用於與基地歐元貨幣轉換率的第二DF貨幣。

Date   EUR CHF  CZK 
2012-08-13  1  1.24  25.73 
2012-08-13  1  1.23  25.92 
2012-08-13  1  1.22  24.00 

現在我想翻譯日費率。我爲這個liske寫了一個函數 getDayRate(date,currency)。

getDayRate <- function(date, currency) { 
currencies[which(as.character(currencies[,c("Date")]) == date),c(currency)] 
} 

getDayRate("2013-06-20","EUR") 

現在我想申請getDayRate(date,currency)TRX每一行,使每一行,它使用的第一和第二個元素作爲參數,所以我得到德ExchangeRate

apply(x,1,fun())不起作用,因爲它需要一個帶數字的矩陣。理論上我不得不將數據框轉換爲索引,然後使用apply。

有沒有更好的方法?

+1

你可以發佈'getDayRate'函數嗎? – dickoa

+1

看看'mapply'。 – Thomas

+1

+1我認爲'mapply'是要走的路 – dickoa

回答

5

隨着mapply你可以這樣做:

mapply(getDayRate, TRX$Date, TRX$Currency) 
+0

where is我正在申請的數據框? – user670186

+0

你說你的數據框叫做'貨幣'。所以,這使用了兩個向量'Date'和'Currency'。 'mapply'的語法與'apply'有些不同(具體來說,函數在數據之前,函數在數據之前)。 – Thomas

+0

我得到這個錯誤:錯誤在mapply(getDayRate,貨幣$日期,貨幣$貨幣): 零長度輸入不能與非零長度 – user670186

0

這應該這樣做是爲了讓apply工作:

apply(your_df, 1, function(x) {getDayRate(x[1], x[2])}) 
+0

這應該工作,但我得到一個錯誤:as.matrix.data.frame(X)中的錯誤: dims [product 5000]與對象的長度不匹配[5009] – user670186

+0

問題是它似乎應用轉換數據幀到矩陣。在這種轉換矩陣比我的數據幀更長,我不知道爲什麼 – user670186

+0

嘗試從'plyr'的'adply'。實際的問題是,這個問題的一切似乎對我來說毫無意義... – Michele

1

你想要的輸出不是那麼清楚。您的函數getDayRate直接從currencies表中硬編碼到它,ExchangeRate選擇日期和貨幣,這是有道理的。

但是,在運行你的函數對同桌從我們給剛剛選擇該列的相同的​​結果它檢索值...

> all.equal(mapply(getDayRate, currencies$Date, currencies$Currency), currencies$ExchangeRate, check.attributes=F) 
[1] TRUE 

也許(我覺得)你真正想要做一些加盟(用你提供的第二個表格)將另一個表格連接到currencies數據框架上datecurrency

編輯:

您的編輯現在澄清事情。你爲什麼不試試這個

library(reshape2) 

melt(currencies)