нет применимого метода для 'mutate_', примененного к объекту класса "c ('integer', 'numeric')" - PullRequest
0 голосов
/ 19 сентября 2018

Моя общая цель - классифицировать изображение, используя случайный лес.Фрейм данных содержит данные обучения;где 'landcover' содержит классы 0, 1 и 2. Я пытаюсь уменьшить количество классов, изменив все 2 на 0, используя метод dplyr transmute ().Весь код работает за исключением критической последней строки - 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 говорится, что «все главные глаголы являются обобщениями S3» для transmute ().Я не очень знаком с S3 и S4, но может ли это быть там, где происходит ошибка?

1 Ответ

0 голосов
/ 19 сентября 2018

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 сохраняет только те переменные, которые вы создали

...