首页 > 解决方案 > 从 R 函数中调用不同的数据帧

问题描述

我正在尝试创建一个函数,该函数让我遍历数据框的每一行并将该行所在的货币转换为欧元,使用该年的汇率,使用以下代码

Valuta <- function(Code, Year, Exchange) {
  for (i in 1:nrow(DataFilter)) {
    if (DataFilter[i,'curcd'] == deparse(substitute(Code))) {
      if (DataFilter[i,'fyear']== deparse(substitute(Year))) {
          DataFilter[i,'ebitda'] <- DataFilter[i,'ebitda'] / Exchange[,'Value'][Exchange[,'Year'==Year]]
          DataFilter[i,'invt'] <- DataFilter[i,'invt'] / Exchange[,'Value'][Exchange[,'Year'==Year]]
          DataFilter[i,'sale'] <- DataFilter[i,'sale'] / Exchange[,'Value'][Exchange[,'Year'==Year]]
      }
    }
  }
}

使用此代码调用函数:

Valuta(GBP, 1999 , EURGBPTMP)

R返回:

Error in Exchange[, "Value"][Exchange[, "Year" == Year]] : 
  invalid subscript type 'list'

GBP 是数据框中的呼号DataFilter

EURGBPTMP是一个包含 2 列的数据框:YearValue,其中每一列Year都是唯一的

使用unlist()返回相同的结果,即使结果Exchange[,'Value'][Exchange[,'Year'==Year]]不应该是列表

添加了示例数据

数据过滤器示例:

DataFilter <- data.frame(curcd = c("EUR", "EUR", "GBP", "USD"), fyear
= c("1999", "2000", "2001", "2001"), ebitda = c(63842000, 248290000, 67014000, 34089000), invt = c(107280000, 188001000, 206027000, 185752000), sale = c(414495000, 935212000, 561064000, 518802000)) 

EURGBPTMP 样本:

EURGBPTMP <- data.frame(Year = c("1999", "2000", "2001","2002"), Value
    = c(0.62170, 0.62410, 0.60850, 0.65050))

使用此示例Valuta(GBP, 1999 , EURGBPTMP)应仅编辑第 3 行

标签: r

解决方案


试试这个功能

conv <- function(df, fxdata, currency) {
  df$fyear <- as.character(df$fyear)
  fxdata$Year <- as.character(fxdata$Year)
  fxdata$Value <- as.numeric(fxdata$Value)
  rn= rownames(df[df$curcd == currency,])
  for(i in rn) {
    y = df[i,]$fyear
    fx = fxdata[fxdata$Year == y,]$Value
    df[i,]$ebitda <- df[i,]$ebitda * fx
    df[i,]$invt <- df[i,]$invt * fx
    df[i,]$sale <- df[i,]$sale * fx
  }
  out <<- df
}

您可以将它用于具有不同外汇汇率文件的所有货币。

> conv(df = DataFilter, fxdata = EURGBPTMP, currency = "GBP")
> out
  curcd fyear    ebitda      invt      sale
1   EUR  1999  63842000 107280000 414495000
2   EUR  2000 248290000 188001000 935212000
3   GBP  2001  40778019 125367430 341407444
4   USD  2001  34089000 185752000 518802000

编辑:

对上述代码的补充。在应用外汇汇率后,这会将货币名称从原始货币更改为 EUR。

conv <- function(df, fxdata, currency) {
  df$fyear <- as.character(df$fyear)
  fxdata$Year <- as.character(fxdata$Year)
  fxdata$Value <- as.numeric(fxdata$Value)
  rn= rownames(df[df$curcd == currency,])
  for(i in rn) {
    y = df[i,]$fyear
    fx = fxdata[fxdata$Year == y,]$Value
    df[i,]$ebitda <- df[i,]$ebitda * fx
    df[i,]$invt <- df[i,]$invt * fx
    df[i,]$sale <- df[i,]$sale * fx
  }
  out <<- df
  out[out$curcd==currency,]$curcd <<- "EUR"
}

> conv(df = DataFilter, fxdata = EURGBPTMP, currency = "GBP")
> out
  curcd fyear    ebitda      invt      sale
1   EUR  1999  63842000 107280000 414495000
2   EUR  2000 248290000 188001000 935212000
3   EUR  2001  40778019 125367430 341407444
4   USD  2001  34089000 185752000 518802000

推荐阅读