投稿问答最小化  关闭

万维书刊APP下载

R语言|数据清洗实战(CHARLS数据库)

2023/5/8 17:26:25  阅读:226 发布者:

背景

经过前面几节笔记,学会了基本的数据清洗技巧。现在我们从CHARLS官网下载公开数据来试一下对数据进行清洗。由于CHARLS数据比较规范,以stata数据文件存储,因此我们没有对其进行自动清洗。首先清洗2011年的demographic_backgroundbiomarkers数据,最后对其进行合并。

2011demographic_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替换为缺失。

biomarker2011年)清洗

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'))

同样的,添加变量标签后,选择了我所需要的变量。原来的数据集中为了区分不同的缺失原因用993999表示缺失,在此我对其全部转化为缺失数据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

转自:“科研写作成长记”微信公众号

如有侵权,请联系本站删除!


  • 万维QQ投稿交流群    招募志愿者

    版权所有 Copyright@2009-2015豫ICP证合字09037080号

     纯自助论文投稿平台    E-mail:eshukan@163.com