as.numeric将实际值更改为最初为因子的数据。

时间:2017-08-04 16:41:11

标签: r numeric

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

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)

1 个答案:

答案 0 :(得分:1)

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))