【问题标题】:calculate rmse in r using lapply使用 lapply 计算 r 中的 rmse
【发布时间】:2014-08-28 17:32:22
【问题描述】:

我在一个目录中有小的 csv 文件。我需要从每个文件中计算 rmse 和 mse。

例如在 Barcelona.csv 中

City, RealMax, ForecastMax
Barcelona, 30, 29
Barcelona, 31, 29
Barcelona, 32, 31
Barcelona, 29, 29
Barcelona, 27, 29

我现在在 R 中有下一个代码

setwd("/home/enric/csv")
filenames <- list.files(pattern="*.csv", full.names=TRUE)  ###I open all the files csv
ldf <- lapply(filenames, read.csv, header=FALSE)
length(ldf)
ldf

foo <- function(x) {
# Function that returns Root Mean Squared Error
rmse <- function(error) {
sqrt(mean(error^2,na.rm = TRUE))
}

# Function that returns Mean Absolute Error
mae <- function(error) {
mean(abs(error))
}

error <- x$V2 - x$V3
mae <- mae(error)  
rmse <- rmse(error)   
return( list( mae = mae, rmse = rmse))
}

res <-lapply(ldf, foo)

我收到这条关于因素的消息...

> res <-lapply(ldf, foo)
Warning messages:
1: In Ops.factor(x$V2, x$V4) : - not meaningful for factors
2: In Ops.factor(x$V2, x$V4) : - not meaningful for factors

如何将因子转换为数值以解决它?好吧,我认为这是问题所在,有什么帮助吗?

【问题讨论】:

  • 有标题时为什么要使用 header = FALSE?整个 csv 文件被读取为转换为因子的字符串
  • 现在,是的!我已更改为 TRUE

标签: r lapply


【解决方案1】:

您可能没有将数据列读取为数字。您可以使用str() 检查对象的结构和类。要在阅读文件时进行转换,请查看read.csv()especially stringAsFactors 的附加选项。您可以通过强制转换为数字来更改类:`as.numeric()'。

【讨论】:

  • 以及如何将 res[i] 保存在不同的 csv 中?例如,一个文件 ErrorBarcelona.csv,在巴塞罗那的名称和值 mae 和 rmse 中,其他城市也一样?
  • 最后,我已经用这段代码部分解决了这个问题,但是我必须在每个文件中引入城市名称 for (i in 1:6) { #I have 6 csv files write.table(res[i], file=paste(i, ".csv", sep="") ,row.names=TRUE, col.names=TRUE, sep=",") }
猜你喜欢
  • 2016-06-25
  • 2019-09-08
  • 2015-10-26
  • 2020-03-04
  • 2018-06-03
  • 2014-03-22
  • 1970-01-01
  • 1970-01-01
  • 2021-08-05
相关资源
最近更新 更多