背景
经过前面几节笔记,学会了基本的数据清洗技巧。现在我们从CHARLS官网下载公开数据来试一下对数据进行清洗。由于CHARLS数据比较规范,以stata数据文件存储,因此我们没有对其进行自动清洗。首先清洗2011年的demographic_background和biomarkers数据,最后对其进行合并。
2011年demographic_background数据清洗
data<-haven::read_spss("D:/data/demographic_background11.sav")#导入数据
skimr::skim(data)#预览数据集信息
names(data)
data1 = add_labelled_class(data)
#保留数据集中所需要的变量
data2<-data1%>%
select(ID,householdID,communityID,ba002_1,ba004,bb002,bb006,
bc001,bd001,bd009,bd011,be001,be002,rgender)%>%
rename(gender=rgender)%>%
mutate(gender=replace(gender,gender==0,NA))
数据集里面的数据非常多,只有几个变量是我需要的,因此我保留了其中有用的变量,对rgender变量重新命名。可能是数据录入问题,通过预览数据信息发现gender有一个人录入0,实际上变量分为两类:1男,2女,因此将0替换为缺失。
biomarker(2011年)清洗
data3<-haven::read_dta("D:/data/biomarkers11.dta")#导入stata数据
skimr::skim(data)
data3 = add_labelled_class(data3)
data4<-data3%>%
select(ID,householdID,communityID,qa003,
qa004,qa005,qa007:qa009,qa011:qa013,
qb002:qb004,qg002,qg003,qi002,ql002,qm002)%>%
mutate(qa003=replace(qa003,qa003>900,NA),
qa004=replace(qa004,qa004>900,NA),
qa005=replace(qa005,qa005>900,NA),
qa007=replace(qa007,qa007>900,NA),
qa008=replace(qa008,qa008>900,NA),
qa009=replace(qa009,qa009>900,NA),
qa011=replace(qa011,qa011>900,NA),
qa012=replace(qa012,qa012>900,NA),
qa013=replace(qa013,qa013>900,NA),
qb002=replace(qb002,qb002>900,NA),
qb003=replace(qb003,qb003>900,NA),
ab004=replace(qb004,qb004>900,NA),
qg002=replace(qg002,qg002>900,NA),
qg003=replace(qg003,qg003>900,NA),
qi002=replace(qi002,qi002>900,NA),
ql002=replace(ql002,ql002>900,NA),
qm002=replace(qm002,qm002>900,NA))%>%
mutate(asystolic=(qa003+qa007+qa011)/3,
adiastolic=(qa004+qa008+qa012)/3)%>%
mutate(hypertension=case_when(asystolic>=140~'Yes',
adiastolic>=90~'Yes',
asystolic<140~'No',
adiastolic<90~'No'))
同样的,添加变量标签后,选择了我所需要的变量。原来的数据集中为了区分不同的缺失原因用993,999表示缺失,在此我对其全部转化为缺失数据NA。另外我想了解研究对象的血压情况,在调查中每个人测了三次血压,三次血压的平均值是研究对象的最终血压,根据均值再判断是否为高血压。因此对数据进行了转换生成了新的变量。
数据合并
#去掉指示变量标签,否则合并会报错
data4$ID<-drop_all_labels(data4$ID)
data2$ID<-drop_all_labels(data2$ID)
data4$householdID<-drop_all_labels(data4$householdID)
data2$householdID<-drop_all_labels(data2$householdID)
data4$communityID<-drop_all_labels(data4$communityID)
data2$communityID<-drop_all_labels(data2$communityID)
datajoin<-left_join(data2,data4,by=c('ID',"householdID","communityID"))
我们要分析高血压患病的一般人口学特征,就需要把两部分数据集连接起来。每个人都有三个ID号作为身份识别码,因为只有部分人有biomarker数据,因此这里用了left_join进行合并。
注意:在清洗过程中,建议每一步都要检查数据的操作是否正确,以免造成数据错误影响统计分析结果准确性。
按照往期笔记和本期示例,大家可以从网上找一些公开数据小试牛刀。
参考文献
https://epirhandbook.com/en/cleaning-data-and-core-functions.html
转自:“科研写作成长记”微信公众号
如有侵权,请联系本站删除!