我的总体目标是使用随机森林对图像进行分类。数据框包含训练数据;其中“ landcover”包含类0、1和2。我正在尝试使用dplyr transmute()方法将所有2都更改为0,以减少类的数量。除了关键的最后一行GP_training1 <- transmute(GP_data$landcover, landcover = ifelse(landcover==1,1,0))
之外,整个代码都有效。当我运行此命令时,我得到一个错误:没有适用于'mutate_'的适用方法应用于类“ c('integer','numeric')”的对象。任何想法为什么会这样?相关代码粘贴在下面。
#import raster and shapefile; each color band is overlayed on top of
eachother w coordinate system underneath
GP_1_4 <- brick("Downloads/Landsat Mosaics/GP_1-4.tif")
names(GP_1_4) <- c("Red","Green","SWIR")
GP_1_4 <- subset(GP_1_4, order(c(3, 2, 1)))
plotRGB(GP_1_4,stretch="lin")
#import shapefile of training points
GP_training < readOGR("Downloads/GP_716_shapefile3/GP_716_training3.shp", layer="GP_716_training3")
list.files("GP_716_shapefile3")
#extract points from raster
dataSet <- as.data.frame(extract(GP_1_4, GP_training))
#and put in same dataframe as training data
GP_training$data = data.frame(GP_training$data, dataSet[match(rownames(GP_training$data), rownames(dataSet)),])
GP_training$data = GP_training$data[complete.cases(GP_training$data),]
#make a new dataframe, identical to GP_training, except the 2's are changed to 0's
GP_training1 <- GP_training
GP_data <- GP_training1$data
GP_training1 <- transmute(GP_data$landcover, landcover = ifelse(landcover==1,1,0))
新编辑: 使用isS4()函数,我发现GP_training是一个S4对象。同时,R文档指出transmute()的“所有主要动词都是S3泛型”。我对S3和S4不太熟悉,但是这可能是发生错误的地方吗?
答案 0 :(得分:2)
dplyr::transmute
仅可用于data.frame,但已为其提供了一个向量:GP_data$landcover
。您应该给它data.frame并使其起作用。
这与您使用的代码不同,但是它可以完成您的注释中所述的内容:
library(dplyr)
GP_training1 <- GP_training %>% # Create a new data.frame from GP_training
mutate(landcover = ifelse(landcover==1,1,0)) # Change the value of `landcover` to
# either 1 or 0 based on its current value
使用mutate
代替transmute
,因为mutate
在退出变量时会添加/更改变量。 transmute
仅保留您创建的变量