Вызов различных фреймов данных из функции R - PullRequest
0 голосов
/ 24 апреля 2020

Я пытаюсь создать функцию, которая позволяет мне go через каждую строку фрейма данных и конвертировать валюту, в которой находится эта строка, в евро, используя обменный курс этого года, используя следующий код

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 столбца: Year и Value, где каждый Year уникален

Использование unlist() возвращает тот же результат, даже если результат Exchange[,'Value'][Exchange[,'Year'==Year]] не должно быть списка

Добавлен образец данных

Образец для DataFilter:

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

1 Ответ

0 голосов
/ 25 апреля 2020

Попробуйте эту функцию

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 после применения курса Forex.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...