r - 从 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 列的数据框:Year
和Value
,其中每一列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 行
解决方案
试试这个功能
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
推荐阅读
- php - 我可以让我的 php 页面重定向带有错误消息的自定义 html 页面吗
- python - 使用 PIL 调整文件夹中所有图像的大小
- javascript - 为什么我的显示隐藏按钮第一次需要双击
- mysql - 我不知道我到底想找到什么
- python - 无法杀死从 python 脚本启动的 fbi 进程
- r - 在 R 中,是否有比使用 'group_by' 后跟 'mutate' 更节省内存的替代方法
- apache-spark - 连续处理模式和python udf
- angular - PHP 应用程序子文件夹中的 Angular 通用应用程序
- vega-lite - 按引用表中的选择过滤
- javascript - 如何在 react.js 中包含 html 视图文件