【发布时间】:2018-09-18 21:06:11
【问题描述】:
我的总体目标是使用随机森林对图像进行分类。数据框包含训练数据;其中 '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 不是很熟悉,但这可能是错误发生的地方吗?
【问题讨论】:
-
在你的最后 5 行
GP_training$data = GP_training$data[complete.cases(GP_training$data),]你正在分配一个可能是不同长度的向量。这将引入NA值,这将导致ifelse问题。 -
您还可以为您的示例提供一个较短或虚拟的数据集。这将使其他人更容易重现。
-
感谢您的提示!我对 R 很陌生,所以我不确定获得公开/简短/简单数据集的好方法是什么——有什么建议吗?
-
dplyr::transmute只能用于 data.frame,但你给了它一个向量:GP_data$landcover。您应该给它 data.frameGP_data并让它与它一起工作:transmute(GP_data, landcover = ifelse(...
标签: r class dplyr random-forest