Цена продажи в вашем data.frame - это, вероятно, символьный или какой-либо другой нечисловой столбец.
Вот пример, чтобы воспроизвести вашу проблему и объяснение, почему вы получаете ошибку, делающую это одним способом, и вы не получаете ошибку, делающую это другим способом.
Давайте смоделируем некоторые данные (я использую набор данных радужной оболочки из пакета MASS и добавляю столбец символов «SalePrice»):
data(iris)
full <- cbind(data.frame(SalePrice=rep("NA", nrow(iris))),iris)
Если мы проверим полный кадр данных, то увидим, что столбец «SalePrice» является символом:
str(full)
# 'data.frame': 150 obs. of 6 variables:
# $ SalePrice : Factor w/ 1 level "NA": 1 1 1 1 1 1 1 1 1 1 ...
# $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
# $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
# $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
# $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
# $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
Теперь давайте рассмотрим, что происходит, когда вы используете следующую функцию:
numericCols <- which(sapply(full[,!(names(full) %in% 'SalePrice')], is.numeric))
cor(full[, numericCols])
numericCols
# Sepal.Length Sepal.Width Petal.Length Petal.Width
# 1 2 3 4
Возвращает числовой вектор с индексом столбца в подмножестве full[,!(names(full) %in% 'SalePrice')]
Как вы можете видеть в моем фрейме данных, «SalePrice - это первый столбец, поэтому, если я исключу его, а затем попытаюсь найти все числовые столбцы в результирующем data.frame, я получу столбцы 1,2,3 и 4 вместо 2,3 4 и 5
А потом, когда я выполняю cor()
функцию, я получаю ошибку:
cor(full[, numericCols])
#Error in cor(full[, numericCols]) : 'x' must be numeric
Ваш другой подход работает, так как возвращает правильные индексы столбцов:
numericCols2 <- which(sapply(full, is.numeric))
numericCols2
#Sepal.Length Sepal.Width Petal.Length Petal.Width
# 2 3 4 5