如何在栅格名称中插入空格? R
How to insert spaces into rasternames? R
我尝试将 space 添加到 rasterstack 的图层名称中
names(predstack)[[1]] <- "MSR670 max"
> names(predstack)[[1]]
[1] "MSR670.max"
我知道这很愚蠢,但我计算了一个模型,花了 7 天的时间来计算。不幸的是,模型变量的一个名称中包含 space。
现在我想在堆栈上进行预测,但这不起作用,因为出现以下错误:
> Prediction2model <- raster::predict(predstack, var2model)
Error in predict.randomForest(modelFit, newdata) :
variables in the training data missing in newdata
> names(predstack)
[1] "MSR670.max" "GLI201809_means"
[3] "MSR670201809_sd" "MVI201805_max"
> var2model$selectedvars
[1] "MSR670 max" "GLI201809_means"
[3] "MSR670201809_sd" "MVI201805_max"
所以我的问题是:如何向栅格图层名称添加 space 字符?
或者之后是否可以更改随机森林模型中的变量名称?
感谢您的任何想法!
names(predstack)[[1]] <- "MSR670 max"
无法正常工作的原因是 names()
函数在 raster
包中的实现方式。
Here you can see the method that is applied when calling the names()
function on an object of class RasterStack
. In line 60 the method calls the validNames()
function which is defined here.
validNames()
又依赖于一个名为 make.names()
的函数,该函数基本上确保字符串中没有空格和其他不需要的字符(例如您的光栅名称)。
因此查看 the way names
方法将名称分配给 class raster
或 rasterStack
的对象给出了我们如何能够的提示来规避这个问题。
TLDR:
predstack[[1]]@data@names <- "MSR670 max"
应直接将名称分配给栅格,而不使用 names()
函数及其实现方法。
因为它不是为了以这种方式分配光栅名称,所以使用这种方法可能会出现问题,但在您的特定情况下可能就足够了。
如果有人遇到同样的问题,这里是当模型变量名称中有 space 时问题的解决方案。
无法更改模型中的名称。正如@Eike 上面所示,可以更改栅格图层名称,但是 raster::predict() 函数将以相同的方式再次更改它们。
唯一的解决方案是提取栅格,然后在数据帧上进行预测。然后,您可以将数据帧的值放入栅格中,并将堆栈的预测作为栅格。
这里是基于给定示例的解决方案
name <- names(predstack)
varname <- var2model$selectedvars
#initialize progressbar
pb = txtProgressBar(min = 0, max = length(predstack), initial = 0, style = 3)
#extracting rasterdata
for (i in 1:length(predstack)){
setTxtProgressBar(pb,i)
#extracting raster values
print(paste0("Starting extracting raster data: ", Sys.time()))
df <- as.data.frame(predstack[[i]])
colnames(df) <- name[[i]]
if(i == 1){
obs <- df
}
else{
print(paste0("Finished extracting raster data: ", Sys.time()))
obs <- cbind(obs,df)
}
}
colnames(obs)[[1]] <- varname[1]
pred_stack_df <- predict(var2model, obs)
predraster <- predstack[[1]]
values(predraster) <- pred_stack_df
我尝试将 space 添加到 rasterstack 的图层名称中
names(predstack)[[1]] <- "MSR670 max"
> names(predstack)[[1]]
[1] "MSR670.max"
我知道这很愚蠢,但我计算了一个模型,花了 7 天的时间来计算。不幸的是,模型变量的一个名称中包含 space。 现在我想在堆栈上进行预测,但这不起作用,因为出现以下错误:
> Prediction2model <- raster::predict(predstack, var2model)
Error in predict.randomForest(modelFit, newdata) :
variables in the training data missing in newdata
> names(predstack)
[1] "MSR670.max" "GLI201809_means"
[3] "MSR670201809_sd" "MVI201805_max"
> var2model$selectedvars
[1] "MSR670 max" "GLI201809_means"
[3] "MSR670201809_sd" "MVI201805_max"
所以我的问题是:如何向栅格图层名称添加 space 字符? 或者之后是否可以更改随机森林模型中的变量名称?
感谢您的任何想法!
names(predstack)[[1]] <- "MSR670 max"
无法正常工作的原因是 names()
函数在 raster
包中的实现方式。
Here you can see the method that is applied when calling the names()
function on an object of class RasterStack
. In line 60 the method calls the validNames()
function which is defined here.
validNames()
又依赖于一个名为 make.names()
的函数,该函数基本上确保字符串中没有空格和其他不需要的字符(例如您的光栅名称)。
因此查看 the way names
方法将名称分配给 class raster
或 rasterStack
的对象给出了我们如何能够的提示来规避这个问题。
TLDR:
predstack[[1]]@data@names <- "MSR670 max"
应直接将名称分配给栅格,而不使用 names()
函数及其实现方法。
因为它不是为了以这种方式分配光栅名称,所以使用这种方法可能会出现问题,但在您的特定情况下可能就足够了。
如果有人遇到同样的问题,这里是当模型变量名称中有 space 时问题的解决方案。
无法更改模型中的名称。正如@Eike 上面所示,可以更改栅格图层名称,但是 raster::predict() 函数将以相同的方式再次更改它们。
唯一的解决方案是提取栅格,然后在数据帧上进行预测。然后,您可以将数据帧的值放入栅格中,并将堆栈的预测作为栅格。
这里是基于给定示例的解决方案
name <- names(predstack)
varname <- var2model$selectedvars
#initialize progressbar
pb = txtProgressBar(min = 0, max = length(predstack), initial = 0, style = 3)
#extracting rasterdata
for (i in 1:length(predstack)){
setTxtProgressBar(pb,i)
#extracting raster values
print(paste0("Starting extracting raster data: ", Sys.time()))
df <- as.data.frame(predstack[[i]])
colnames(df) <- name[[i]]
if(i == 1){
obs <- df
}
else{
print(paste0("Finished extracting raster data: ", Sys.time()))
obs <- cbind(obs,df)
}
}
colnames(obs)[[1]] <- varname[1]
pred_stack_df <- predict(var2model, obs)
predraster <- predstack[[1]]
values(predraster) <- pred_stack_df