Общая цель моего кода — вычислить относительные ошибки в масштабе пикселей после агрегирования карты с высоким разрешением в карту с низким разрешением. Для этого я уже создал фрейм данных (обозначенный здесь как df), который, по крайней мере, объединяет эти числа. Затем я хотел вычислить относительную ошибку для каждого пикселя с грубым разрешением, и для этого мне нужно вычислить среднеквадратичную ошибку между грубым пикселем и содержащимися в нем мелкими пикселями, а также среднее значение мелких пикселей. это содержит. Затем необходимо перебрать все грубые пиксели.
Хотя я решил эту проблему с помощью цикла for (см. ниже), это не самый оптимальный фрагмент кода, особенно потому, что фрейм данных довольно большой (в основном потому, что я просматриваю большую область интереса).
Я считаю, что более эффективный подход использует by() или, может быть,aggregate()?, но я не уверен, как это можно выполнить. Я пытался адаптировать код (в частности, цикл for) к этой функции, но безуспешно. Любые мысли о том, как заставить его работать с by()?
df <- as.data.frame(cbind(FineSP@data,extract$cells,extract$coarseval))
names(df)[1] <- "fine_res_values"
names(df)[2] <- "cellnumber"
names(df)[3] <- "coarse_res_values"
df$cellnumber <- as.character(df$cellnumber)
uniquecells<-unique(df$cellnumber)
rmse_user <- function(fine, coarse){ # user fuction to calculate root-mean squared error
rmse_fun = sqrt( mean( (fine - coarse)^2, na.rm = TRUE) )
return(rmse_fun)
}
relative_error_user <- function(fine, coarse){ # user fuction to calculate pixel-scale relative error
relative_error_value <- round(rmse_user(fine, coarse) / mean(fine), 3)
return(relative_error_value)
}
relerror_compile <- vector()
i<-1
for(i in 1:length(uniquecells)){
filter <- df[which(df$cellnumber == uniquecells[i]),] # subset data frame by matching cell numbers
relerror_compile[i] <- relative_error_user(fine = filter$fine_res_values, coarse = filter$coarse_res_values) # apply the user-based function for relative error
}
# Initial (and unsuccessful) attempt to use by() as the alternative
by_test <-by (df$fine_res_values,list(df$cellnumber),FUN=function(z)
Aggregate может это сделать, но рассматривали ли вы пакет plyr? Лично я нахожу это более «удобным для пользователя»:
df <- data.frame(cellnumber=rep(1:3,each=4),
fine_res_value=rnorm(12,10,5),
coarse_res_value=rnorm(12,10,5))
library(plyr)
RE <- ddply(df,'cellnumber',function(x){round(sqrt( mean( (x$fine - x$coarse)^2, na.rm = TRUE) ) / mean(x$fine), 3)} )