R使用值作为参数将函数应用于数据帧行

时间:2013-06-27 12:40:03

标签: r apply

我有一对df TRX,有成对的Date和Curreny

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

对于欧元基础货币兑换率,我有第二个df CURRENCIES。

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(日期,货币)。

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。

有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

使用mapply,您可以执行以下操作:

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

答案 1 :(得分: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)

答案 2 :(得分:0)

这样做可以让apply起作用:

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