Почему эти два объекта не одинаковы? - PullRequest
0 голосов
/ 22 июня 2019

Я новичок в R и Stack Overflow, поэтому, вероятно, мой вопрос делает много ошибок, заранее извините.

Я использую функцию Caret cor(), и мне потребовался час, чтобы исправить небольшую проблему, но я все еще не понимаю, в чем дело. В основном у меня есть data.frame, и я хочу пометить числовые переменные, которые сильно коррелированы. Поэтому я создаю подмножество числовых переменных, за исключением SalePrice, у которого в наборе тестов NA s:

numericCols <- which(sapply(full[,!(names(full) %in% 'SalePrice')], is.numeric))   

Тогда

cor(full[,numericCols])    

выдает ошибку:

Ошибка в cor (full [, numericCols]): «x» должно быть числовым.

За исключением случаев, когда я делаю это так:

numericCols2 <- which(sapply(full, is.numeric))    
numericCols2 <- numericCols2[-31] #dropping SalePrice manually    

это работает просто отлично.

Когда я делаю numericCols == numericCols2, вывод:

LotFrontage     
TRUE    
LotArea    
TRUE    
# .    
# .   All true    
# .    
HouseAge    
FALSE    
isNew    
FALSE    
Remodeled    
FALSE    
BsmtFinSF    
FALSE    
PorchSF    
FALSE    

Все ложные являются переменными, которые я создал сам, например HouseAge:

full$HouseAge <- full$YrSold - full$YearBuilt    

Почему это происходит?

1 Ответ

1 голос
/ 22 июня 2019

Цена продажи в вашем 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...