• R语言
  • [已解决]data.frame(stringsAsFactor=F) 用途。

请问在使用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. 求解释,谢谢!!

    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就可以避免上面这样的错误

      tctcab 更改标题为「[已解决]data.frame(stringsAsFactor=F) 用途。