有什么方法可以简化R代码吗?

时间:2015-05-29 20:08:55

标签: 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 个答案:

答案 0 :(得分: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结构列表并使用 for循环进行遍历。这减少了代码复制和粘贴,使您的脚本更加灵活,因为更改文件数量不需要太多的手动工作。

比for循环更好的想法是使用 apply 函数系列,因为它们更快,语法更易于理解。

使用上面定义的函数和基础R的lapply,OP的算法减少到

# 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"
相关问题