基于R软件的一组多选题判分与数据编码转换
2018-01-30江苏省灌南县疾病预防控制中心222500封永昌刘阿玲丁梦秋
江苏省灌南县疾病预防控制中心(222500) 封永昌 刘阿玲 丁梦秋
多选题(multiple response)数据录入常用的编码方法有二分法编码、分类法编码和原始编码,多分类编码和原始编码录入比较简便,二分法编码符合统计分析原则[1-2]。目前国内学者对多选题数据转换与统计分析,多以单个多选题为例,使用excel、SPSS或SAS软件实现变量编码转换和统计分析[1-5],对于问卷设计为多个多选题的情况并使用R软件实现的讨论较少。R作为一款功能卓越的免费软件,近年来在卫生领域的应用明显增多[6]。本文主要介绍问卷中一组多个多选题的判分以及原始编码数据转换为二分法编码的R软件实现。
实例及R软件实现方法
设计思想参照文献[1-2],此处不赘述。
1.实例:全国居民健康素养监测调查问卷(2016年江苏版),该问卷的主体有判断题、单选题、多选题、情景题等4模块共56题,其中多选题模块有16题(未包含情景题模块多选题),每题配置5个选项,作答的所选项按其编号从小到大顺序形成数字字符串录入到Epidata数据文件中。问卷整理需要根据正确答案对每份调查问卷的每一题进行判分,再根据总分和各维度得分情况判定是否具备健康素养;现为进一步挖掘问卷更多信息,对多选题选项按二分法编码[6-7]。16个多选题的标准答案依次为{123,14,123,123,34,1234,123,123,1234,1234,13,23,23,124,124,23},使用软件R i386 3.3.2 for Windows和R Studio V1.0.44 (下载地址https://cran.r-project.org 和https://www.rstudio.com)。
2.数据导入:原始数据在EpiData软件下输出为文本文件sy.txt,用R软件的read.csv2()函数导入,在R中建立数据表对象sy,sy中16个多选题的变量名为C01~C16,语句为(#号后为注释内容,下同):
sy<-read.csv2("sy.txt",header = TRUE,sep = ";")
#此处sy.txt文件在R的当前工作路径。
3.多选题判分:根据正确答案构建向量XC,对每题判分,“完全正确”赋2分,“错误”赋0分;在sy中建立后缀为-s的16个新变量即C01s、C02s、C03s、……、C16s,存放各题的赋分值。语句为:
XC<-c("123","14","123","123","34",
"1234","123","123","1234","1234","13",
"23","23","124","124","23")
#多选题判分标准答案。
ic<-c(paste0("0",1:9),10:16)
#建立序号向量01~16
t1<-paste0("sy$C",ic,"s<-ifelse((sy$C",ic,"==",XC,"),2,0)")
eval(parse(text=t1))
#粘合的判分字符串t1转化为表达式并求解。
4.各题所选项转换为二分法编码,生成后缀为v1~v5的新变量,即C01v1、C01v2、…、C01v5,C02v1、C02v2、…、C02v5,…、C16v5等计80个新变量,赋值0或1。语句为:
t2<-paste0("sy$C",ic,"<-as.character(sy$C",ic,")");#各题所选项数值转换为字符型
eval(parse(text=t2))
for (i in 1:5) {
t3<-paste0("sy$C",ic,"v",i,"<-as.numeric(regexpr(",i,",sy$C",ic,")>0)")
eval(parse(text=t3))
}
5.假如某一多选题选项数目超过9个,在录入时可用单字母代替>9的选项编码。例如,假设问卷中某多选题的题号为C18,选项有12个,1~9的选项以所选项数字直接录入,>9的选项以单字母a、b、c录入代替其原编号10、11、12,录入后转换为二分法编码,生成C18m1至C18mc共12个新变量,赋值0或1。不访虚构前5例的所选项编码为“321c6ba”、“5428c”、“21a”、“123”、“256abc”,以便与命令语句及其后的注释“#虚构的所选项编码”对应。语句可用:
m<-c(1:9,"a","b","c")
sy$C18<-c ("321c6ba","5428c","21a",
"123","256abc")
#虚构的所选项编码
for (j in 1:length(m)) {
t5<-paste0("sy$C18m",m[j],"<-as.numeric(regexpr(‴,m[j],‴,sy$C18)>0)")
eval(parse(text=t5))
}
6.假如发现多选题的所选项编码没有按从小到大顺序录入,例如录入编码为“4231”,需要调整为“1234”方可在判分时不出错,转换时可建立新变量C01a~C16a便于对照。语句为:
for (b in 1:nrow(sy)) {
cl<-paste0("sy$C",ic,"a[",b,"]<-")
cr<-paste0("paste0(sort(strsplit(sy$C",ic,"[",b,"],")[[1]]),collapse=")")
t4<-paste0(cl,cr)
eval(parse(text=t4))
}
讨 论
调查问卷中设计多选题是为了最大限度采集研究所需要的信息,研究多选题编码录入与转换是为了最大可能提高录入的效率和准确性,尽可能对数据进行深入的分析和挖掘。采用excel、SPSS、SAS等软件对调查问卷中一组多个多选题进行判分和编码转换仍比较繁琐,且存在商业软件的使用版权问题。本文使用完全开源免费的R软件,以健康素养监测调查问卷中多选题为例,提供了一组多选题的判分及选项按二分法进行编码转换的运行语句,原理与方法简单,具有操作上的可复制性和功能上的可扩展性,在保留原始编码法录入优点的基础上,为研究者对多选题数据进行深度挖掘提供了方便[5-7]。
R软件处理数据的强大优势在于向量化操作。本文在根据多选题标准答案进行判分和所选项原始编码转换为二分法编码时,使用ifelse()、regexpr()、strsplit()、sort()、paste0()等函数[8-9]与for循环,根据所选项编码中是否包含多选题的某选项编号,返回给该选项的二分法变量值1或0。本文中R语句的巧妙在于,以向量化操作为基础,利用paste0()函数拼接出执行语句的文本字符串,用parse() 函数将字符串转化为一组表达式,最后用 eval() 函数对表达式求解,使语句显得十分简洁,又能提高运行速度[9]。多选题选项个数>9的情况,本文建议将>9的选项编码以单字母(即a、b、c、……)代替其原编码(即10、11、12、……)进行录入,在R软件下仍可轻松进行二分法编码转换。需要注意的是,若问卷中设计的每个多选题选项数目不一致(如有的是8个选项,有的是5个选项,有的是3个选项),可按最多的选项数目定义循环次数变量,语句执行后仅在数据框对象中增加一些无意义的多余新变量,不影响数据的进一步分析,或对多余新变量进行删除处理(如删除数据表sy中变量C06v7的语句可用“sy$ C06v7<-NULL”)。 期望本文能为居民健康素养监测以及其他社会调查领域的研究者在数据整理时提供参考。