2014-08-28 74 views
0

我在一個目錄中有小的csv文件。我需要從每個文件中計算rmse和mse。使用lapply計算rmse

例如內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 

如何將因子轉換爲數值來解決它?那麼我認爲這是問題,有什麼幫助?

+0

爲什麼使用header = FALSE當你有一個頭?整個csv文件正在被讀入字符串,現在轉換爲因子 – rawr 2014-08-28 17:36:04

+0

,是的!我已更改爲TRUE – 2014-08-29 06:53:32

回答

0

可能您還沒有以數字形式讀取您的數據列。您可以使用str()來檢查對象的結構和類別。要在閱讀文件時進行轉換,請查看read.csv()especially stringAsFactors的其他選項。您可以通過強制轉換爲數字來更改類:`as.numeric()'。

+0

以及如何將res [i]保存在不同的csv中?例如,一個文件ErrorBarcelona.csv,裏面的巴塞羅那的名稱和價值mae和rmse,併爲其他城市一樣? – 2014-08-28 18:42:47

+0

最後,我已經用這段代碼部分解決了這個問題,但是我必須在每個文件裏面都介紹這個城市的名字(我在1:6){#I有6個csv文件 write.table(res [ i],file = paste(i,「.csv」,sep =「」),row.names = TRUE,col.names = TRUE,sep =「,」)} – 2014-08-29 11:15:29

+0

它已解決!!!! – 2014-08-29 12:00:53