这两个对象为什么不一样?

时间:2019-06-22 00:14:50

标签: r

我是R和Stack Overflow的新手,所以我的问题可能会犯很多错误,在此先抱歉。

我正在使用插入符号的cor()函数,花了一个小时才能解决一个小问题,但我仍然不明白这是怎么回事。基本上,我有一个data.frame,并且我想标记高度相关的数字变量。因此,我创建了数字变量的子集,但SalePrice除外,后者在测试集中具有NA

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 个答案:

答案 0 :(得分:1)

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是第一列,所以如果我排除它,然后将尝试在结果数据中查找所有数字列。我将获得列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