如何在栅格名称中插入空格? 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 rasterrasterStack 的对象给出了我们如何能够的提示来规避这个问题。

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