yutingwu816
有意思的问题~
在计算机存储不发达的时候,将字符串储存为factor可以有效节省存储空间。factor的vector包括两部分,一个数字向量和一个levels用于记录数字->字符串的映射:
data(iris)
as.numeric(iris$Species)
#
[1] 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2
[60] 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
[119] 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
levels(iris$Species)
# setosa -> 1
# versicolor -> 2
# virginica -> 3
[1] "setosa" "versicolor" "virginica"
而且也是合理的:因为R的主要运用范围是统计分析,字符串基本就是分类变量了。
很多时候这并没有什么问题,下面展示一下有问题的情况:
data(iris)
tmp_species <- iris$Species[1:5]
print(tmp_species)
# looks fine
[1] setosa setosa setosa setosa setosa
Levels: setosa versicolor virginica
## add abcd at a tail of Species
tmp2 <- c(tmp_species,"abcd")
print(tmp2)
# where are the setosas?
[1] "1" "1" "1" "1" "1" "abcd"
看,如果不知道Species是factor的时候,在后面的加个abcd,并没有获得预期的字符串向量,正确的做法:
data(iris)
tmp_species <- iris$Species[1:5]
tmp_species
tmp3 <- c(as.character(tmp_species),"abcd")
tmp3
# as expected
[1] "setosa" "setosa" "setosa" "setosa" "setosa" "abcd"
所以stringsAsFactor=F就可以避免上面这样的错误