如何在栅格名称中插入空格? R

时间:2021-02-20 16:54:46

标签: r random-forest raster r-raster names

我尝试在栅格堆栈的图层名称中添加一个空格

names(predstack)[[1]] <- "MSR670 max"
> names(predstack)[[1]]
[1] "MSR670.max"

我知道这很愚蠢,但我计算了一个需要 7 天计算的模型。不幸的是,模型变量的一个名称在名称中包含一个空格。 现在我想在堆栈上进行预测,但这是行不通的,因为出现以下错误:

> 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"

所以我的问题是:如何向栅格图层名称添加空格字符? 或者之后是否可以更改随机森林模型中的变量名称?

感谢您的任何想法!

2 个答案:

答案 0 :(得分:2)

names(predstack)[[1]] <- "MSR670 max" 未按预期工作的原因是 names() 函数在 raster 包中的实现方式。

Here 您可以看到在对类 names() 的对象调用 RasterStack 函数时应用的方法。在第 60 行,该方法调用了定义为 herevalidNames() 函数。

validNames() 反过来依赖于一个名为 make.names() 的函数,该函数基本上确保字符串中没有空格和其他不需要的字符(例如您的光栅名称)。

因此,查看 the waynames 方法将名称分配给类 rasterrasterStack 的对象,提示我们可以如何规避该问题。< /p>

TLDR:

predstack[[1]]@data@names <- "MSR670 max"

应直接将名称分配给栅格,而不使用 names() 函数及其实现的方法。

由于它不打算以这种方式分配栅格名称,因此这种方法可能会出现问题,但在您的特定情况下可能就足够了。

答案 1 :(得分:1)

如果有人遇到同样的问题,这里是模型变量名称中有空格时的解决方案。

无法更改模型中的名称。正如上面@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
相关问题