我是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
为什么会这样?
答案 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