2015-05-29 2 views
1

У меня есть следующий код, но он кажется очень длинным, потому что я делаю то же самое для каждого файла, который, как я понял, должен быть способ упрощения, но он называет меня в настоящее время! Любая помощь оценивается, как всегда:Любой способ упростить R-код?

.LVB.SF.1.1 <- read.csv("LVB_SF_1-1.csv", header=T, sep=","); .LVB.SF.1.6 <- read.csv("LVB_SF_1-6.csv", header=T, sep=",") 
.LVB.SF.1.2 <- read.csv("LVB_SF_1-2.csv", header=T, sep=","); .LVB.SF.1.7 <- read.csv("LVB_SF_1-7.csv", header=T, sep=",") 
.LVB.SF.1.3 <- read.csv("LVB_SF_1-3.csv", header=T, sep=","); .LVB.SF.1.8 <- read.csv("LVB_SF_1-8.csv", header=T, sep=",") 
.LVB.SF.1.4 <- read.csv("LVB_SF_1-4.csv", header=T, sep=","); .LVB.SF.1.9 <- read.csv("LVB_SF_1-9.csv", header=T, sep=",") 
.LVB.SF.1.5 <- read.csv("LVB_SF_1-5.csv", header=T, sep=","); .LVB.SF.2.0 <- read.csv("LVB_SF_2.csv", header=T, sep=",") 

# Interpolate the missing monthly values - linear interpolation of above 
x <- zoo(.LVB.SF.1.1); .LVB.SF.1.1 <- as.data.frame(na.approx(x)); x <- zoo(.LVB.SF.1.2); .LVB.SF.1.2 <- as.data.frame(na.approx(x)) 
x <- zoo(.LVB.SF.1.3); .LVB.SF.1.3 <- as.data.frame(na.approx(x)); x <- zoo(.LVB.SF.1.4); .LVB.SF.1.4 <- as.data.frame(na.approx(x)) 
x <- zoo(.LVB.SF.1.5); .LVB.SF.1.5 <- as.data.frame(na.approx(x)); x <- zoo(.LVB.SF.1.6); .LVB.SF.1.6 <- as.data.frame(na.approx(x)) 
x <- zoo(.LVB.SF.1.7); .LVB.SF.1.7 <- as.data.frame(na.approx(x)); x <- zoo(.LVB.SF.1.8); .LVB.SF.1.8 <- as.data.frame(na.approx(x)) 
x <- zoo(.LVB.SF.1.9); .LVB.SF.1.9 <- as.data.frame(na.approx(x)); x <- zoo(.LVB.SF.2.0); .LVB.SF.2.0 <- as.data.frame(na.approx(x)) 

# Create rowmeans columns for all the above 
.LVB.SF.1.1$Mean <- rowMeans(.LVB.SF.1.1[,c(2:4)]); .LVB.SF.1.6$Mean <- rowMeans(.LVB.SF.1.6[,c(2:4)]) 
.LVB.SF.1.2$Mean <- rowMeans(.LVB.SF.1.2[,c(2:4)]); .LVB.SF.1.7$Mean <- rowMeans(.LVB.SF.1.7[,c(2:4)]) 
.LVB.SF.1.3$Mean <- rowMeans(.LVB.SF.1.3[,c(2:4)]); .LVB.SF.1.8$Mean <- rowMeans(.LVB.SF.1.8[,c(2:4)]) 
.LVB.SF.1.4$Mean <- rowMeans(.LVB.SF.1.4[,c(2:4)]); .LVB.SF.1.9$Mean <- rowMeans(.LVB.SF.1.9[,c(2:4)]) 
.LVB.SF.1.5$Mean <- rowMeans(.LVB.SF.1.5[,c(2:4)]); .LVB.SF.2.0$Mean <- rowMeans(.LVB.SF.2.0[,c(2:4)]) 

# RMSE Calculation 
LVB.RMSE.TWS.1.1 <- rmse(LVB.OBS.TWS.LAG_ONLY[,1], .LVB.SF.1.1[,5]); LVB.RMSE.TWS.1.6 <- rmse(LVB.OBS.TWS.LAG_ONLY[,1], .LVB.SF.1.6[,5]) 
LVB.RMSE.TWS.1.2 <- rmse(LVB.OBS.TWS.LAG_ONLY[,1], .LVB.SF.1.2[,5]); LVB.RMSE.TWS.1.7 <- rmse(LVB.OBS.TWS.LAG_ONLY[,1], .LVB.SF.1.7[,5]) 
LVB.RMSE.TWS.1.3 <- rmse(LVB.OBS.TWS.LAG_ONLY[,1], .LVB.SF.1.3[,5]); LVB.RMSE.TWS.1.8 <- rmse(LVB.OBS.TWS.LAG_ONLY[,1], .LVB.SF.1.8[,5]) 
LVB.RMSE.TWS.1.4 <- rmse(LVB.OBS.TWS.LAG_ONLY[,1], .LVB.SF.1.4[,5]); LVB.RMSE.TWS.1.9 <- rmse(LVB.OBS.TWS.LAG_ONLY[,1], .LVB.SF.1.9[,5]) 
LVB.RMSE.TWS.1.5 <- rmse(LVB.OBS.TWS.LAG_ONLY[,1], .LVB.SF.1.5[,5]); LVB.RMSE.TWS.2.0 <- rmse(LVB.OBS.TWS.LAG_ONLY[,1], .LVB.SF.2.0[,5]) 

Спасибо!

+1

Попробуйте петлю, возможно? – Frank

+4

Вы можете прочитать все файлы в списке, а затем выполнить все операции в списке. то есть 'files <- list.files (pattern = 'LVB_SF _. *. csv'); lst <- lapply (файлы, read.table, header = TRUE, sep = ","); lapply (lst, function (x) zoo (..)) ' – akrun

+1

Отлично - я дам это попробовать - большое спасибо @akrun –

ответ

2

Выполнение одной и той же последовательности действий несколько раз, Состав функции должен много помочь. Например,

interpolate <- function(x) as.data.frame(na.approx(zoo(x))) 

# take data.frame and add 'Mean' column containing mean of columns 2:4 
addRowmeans <- function(x) { 
    x$Mean <- rowMeans(x[ , 2:4]) 
    x 
} 

Использование этих параметров сделает ваш код менее громоздким, как показано в конце.

Что касается итерирования с помощью наборов данных для выполнения вышеуказанных действий, вы можете использовать список структуры data.frames и пройти через него, используя для цикла. Это уменьшает кодовое копирование и вставку и делает ваш скрипт более гибким, так как изменение количества файлов не требует большой ручной работы.

Лучше идея, чем для циклов, использовать применить семейство функций, как в R, они быстрее и имеют более понятный синтаксис.

С функциями определено выше, и lapply от базовой R, алгоритм из ОП сводится к

# read all files, store them as list of data.frames 
lapply(files, read.csv, h = TRUE) -> data.list 

# Interpolate the missing monthly values - linear interpolation of above 
lapply(data.list, interpolate) -> data.interpolated 

# Create rowmeans columns for all the above 
lapply(data.interpolated , addRowmeans) -> data.interpolated 

# RMSE Calculation  (assuming rmse has arguments names x and y) 
lapply(data.interpolated[5], function(x) rmse(LVB.OBS.TWS.LAG_ONLY[1], x)) 

где файлы были созданы, как показано ниже

sprintf('%1.1f', seq(from = 1.9, to = 2.1, by = .1)) -> nums 
files <- paste('prefix_', nums, '.csv', sep = '') 

files 
[1] "prefix_1.9.csv" "prefix_2.0.csv" "prefix_2.1.csv" 
Смежные вопросы