请问在使用data.frame构建数据集的时候,手动设定stringsAsFactor=F的用处什么?有上谷歌上找过答案但是看不太懂。有个答案是这么说的:R often uses a concept of factors to re-encode strings. This can be too early and too aggressive. Sometimes a string is just a string. 求解释,谢谢!!
[已解决]data.frame(stringsAsFactor=F) 用途。
- 已编辑
有意思的问题~
在计算机存储不发达的时候,将字符串储存为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
就可以避免上面这样的错误
yutingwu816 简单来说就是为了避免 R 自作聪明。设为 False 比较安全。
tctcab 谢谢这么详细的回答,例子很容易懂。
dapengde 哈哈谢谢,大概了解它的功能了。
tctcab 更改标题为「[已解决]data.frame(stringsAsFactor=F) 用途。」