as.numeric 将实际值更改为数据,这本来是一个因素。

as.numeric changes the actual values as data which is originally a factor.

当我将 as.numeric 和 as.integer 应用于列时,它会更改值。为什么是这样?例如:

test <- data.frame(structure(c("52053,34", "79032,83", "20679,06", "20799,56", "20679,06", 
        "21279,45", "51789,44", "54189,45", "73138,89", "73138,89"), .Dim = c(10L, 
                                                                              1L)))
names(test)[names(test) == "structure.c..52053.34....79032.83....20679.06....20799.56....20679.06..."] <- "column"

test$b <- as.numeric(test$column)
test$c <- as.integer(test$column)

test$column 是一个因素。

class(test$column)
## [1] "factor"

levels(test$column) 显示因子水平的标签。

levels(test$column)
## [1] "20679,06" "20799,56" "21279,45" "51789,44" "52053,34" "54189,45" "73138,89"
## [8] "79032,83"

实际数据值为整数:5、8、1等

unclass(test$column)
## [1] 5 8 1 2 1 3 4 6 7 7
## attr(,"levels")
## [1] "20679,06" "20799,56" "21279,45" "51789,44" "52053,34" "54189,45" "73138,89"
## [8] "79032,83"

test$column的第一个元素用整数5表示,因为它是第5层。查看级别向量,我们看到第 5 级的标签是

levels(test$column)[5]
## [1] "52053,34"

一般来说,我们想要获取每个对应元素的标签并将它们中的每一个转换为数字:

as.numeric(sub(",", ".", levels(test$column))[test$column])
##  [1] 52053.34 79032.83 20679.06 20799.56 20679.06 21279.45 51789.44 54189.45
##  [9] 73138.89 73138.89

或者试试这个较短的版本:

as.numeric(sub(",", ".", test$column))
##  [1] 52053.34 79032.83 20679.06 20799.56 20679.06 21279.45 51789.44 54189.45
##  [9] 73138.89 73138.89

如果数字首先使用小数点表示(而不是逗号),那么在 x 是这样一个因子的情况下就足够了:

as.numeric(as.character(x))