美文网首页
技术日记_备查:R中的缺失值替换

技术日记_备查:R中的缺失值替换

作者: 想好的笔名被占用 | 来源:发表于2020-04-10 13:35 被阅读0次
    关键字:R; 缺失值替换; collostruction analysis; linguistics

    背景:
    开题pilot study想用 collostruction analysis(或distinctive collexeme analysis,DCA,本质为Fisher exact test)看看to-infinitival complement在两种英语变体(American English和Singapore English)和哪些matrix verbs联系紧密,遂用ICE-USA和ICE-Singapore作为原始语料,以#lancbox为工具检索抽取所需语料,并使用R做统计分析。

    问题描述:
    提取所需数据后,将数据放在excel中做调整,并保存为xlsx,用R中的openxlsx读出数据,cbind()其中两列到新变量a,此时这两列数据就变成了factor类型。如法炮制变量bmerge()到变量c,想用c[is.na(c)] <- 0替换掉空缺值时报错如下:

    Warning message:
    In `[<-.factor`(`*tmp*`, thisvar, value = 0) :
      invalid factor level, NA generated
    

    原因及解释:
    从网上查找后初步得出原因,是由于在cbind()一步中将两列原始数据变成了factor类型,0不属于自动判定的level。

    详细原因待补充。

    解决方法:
    对于merge()后的变量c,先将其中的列从factor类型转换成需要的类型再进行缺失值的替换操作,比如在当前场景(collostruction analysis)下,需要(1)将第一列数据(collocations)转换为为字符类型;(2)将第二、三列数据(frequency)转换为数字类型(数据示例如下):

    变量c的部分数据(此时三列数据还未处理,都是factor类型)
        collocations   USAfrequency  SAPfrequency
    1         accord            10             8
    2          agree            16            14
    3            aim             5            13
    4          allow            13            25
    5         appear            31            41
    6          apply             6             7
    7            ask            16            16
    8         assign             5          <NA>
    9        attempt            48            19
    10            be             0           304
    11         begin            85            48
    12       believe            10            21
    13         build             6          <NA>
    14     calculate             5          <NA>
    15          call             6             6
    
    

    (1)将第一列转换为字符类型:
    c$collocations <- as.character(c$collocations)
    (2)将第二列转换为数字类型,此时需注意不能直接用as.numeric(),因为R会按照原先factor的levels来赋予数值,第一个level变成数字1,第二个level变成数字2......因此为了保证数据中数字不变化只变换类型,需要先转换为字符再转换为数字:
    c$USAfrequency <- as.numeric(as.character(c$USAfrequency))
    第三列同上。

    至此,c中的缺失值NA便可使用c[is.na(c)] <- 0来替换了。

    反思:
    避免这个问题的方法有很多种,比如所需数据保存为.csv,在R中用read.csv()时将参数stringAsFactors设置为FALSE。或者在建立dataframe的时候设置同样的参数,都可以避免上述问题。
    本文档用于备查,要是能帮到你就更好啦~

    相关文章

      网友评论

          本文标题:技术日记_备查:R中的缺失值替换

          本文链接:https://www.haomeiwen.com/subject/cnilmhtx.html