关键字: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类型。如法炮制变量b
后merge()
到变量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的时候设置同样的参数,都可以避免上述问题。
本文档用于备查,要是能帮到你就更好啦~
网友评论