分享

R语言系列X1:R4.0:stringsAsFactors或默认为FALSE

 松哥精鼎统计 2020-10-23
导读
    自R创建以来,在默认情况下,在R中直接使用data.frame()或read.table()时,stringsAsFactors和as.is默认是都是将字符串转换为因子,在3.6.2版本之前,都是这样的,但是在4.0版本中,这有可能发生改变。这是笔者使用时发现的问题,属于R系列的杂谈部分,也许大家也会碰到!

历史





    在R 的历史 ,我们讲到, Ross Ihaka  and Robert Gentleman  两位教授在1992年开始着手创建R,1995年R有了雏形,2000年R才有了第一个正式版本。

    在1998年,R发布了0.62版本,内部代码被John Chambers贡献的Statlib代码替换,其效果是data.frame()函数通过stringsAsFactors始终将字符串转换为因数(除非受所保护I()),而read.table()始终具有as.is和stringsAsFactors参数。

举例解释





    我们用data.frame()来举例说明
    首先,我们创建一个数据框
df = data.frame(num=1,chr='a')df## num chr## 1 1 a

    数据框df是一个2列1行的数据,第1列是数字1,第2列是字母2。我们使用str()函数来查看数据结构。

str(df)## 'data.frame': 1 obs. of 2 variables:## $ num: num 1## $ chr: Factor w/ 1 level "a": 1

    我们发现num列是数字类型numeric;chr是factor类型。我们在使用I()将作用在chr上
df_I = data.frame(num=1,chr=I('a'))str(df_I)## 'data.frame': 1 obs. of 2 variables:## $ num: num 1## $ chr: 'AsIs' chr "a"

    我们看到,这个时候chr列就不是factor,而是char了。

问题在哪里?






    那么为什么要改变?问题在哪里?我们使用unlist()函数来演示问题。

unlist(list(df))## num chr## 1 1unlist(list(df_I))## num chr## "1" "a"
    看到差别了吗?
    前者将a转行成了1,后者则保留了a,后者显然是我们想要的。
    这只是一个小例子,相信很多R的使用者并没有注意到这一点,或者会觉得很奇怪。

R4.0初体验






  你可以在这里下载R4.0体验版windows系统:https://cran./bin/windows/base/rdevel.html


    mac(macx)系统:http://mac./
    linus系统:R网站上自己找一下,在R4.0中的演示。
version## _ ## platform x86_64-w64-mingw32 ## arch x86_64 ## os mingw32 ## system x86_64, mingw32 ## status ## major 4 ## minor 0.0 ## year 2020 ## month 02 ## day 21 ## svn rev 77847 ## language R ## version.string R Under development(unstable)## nickname Unsuffered Consequencesdf_4=data.frame(num=1,chr='a')str(df_4)## 'data.frame': 1 obs. of 2 variables:## $ num: num 1## $ chr: Factor w/ 1 level "a": 1

    很遗憾,在pre-R 4.0中,我并未发现stringsAsFactors默认为FALSE,不知道在正式版的4.0中是否会发生改变,一起期待。

总结






   是否将string转换为factor,一定要自己小心。


精鼎特邀

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多