1 数据的读入与处理
代码提供 and 整理: 曾子尧 修改: 黄国政(2023.4.23)
1.1 数据读入以.dta格式为例
.dta格式是stata使用的数据格式,国内各数据库大多都有这个格式的数据。
这里介绍两种读取方式read_dta和read.dta13
前一种来自于haven包,后一个来自readstata13包
两个包有一处明显区别。前者读取对应的编码数值和标签,而后者直接读出标签的内容。
如下图展示。
library(haven)
library(readstata13)
<- read_dta("D://02_work/2020sRBook/css2019.dta")
css2019a <- read.dta13("D://02_work/2020sRBook/css2019.dta") css2019b
## Warning in read.dta13("D://02_work/2020sRBook/css2019.dta"):
## Missing factor labels for variables
##
## d4b3_4
##
## No labels have been assigned.
## Set option 'generate.factors=TRUE' to generate labels.
#可以观察以下两行
#css2019a$a1e1
#css2019b$a1e1
虽然后者会带来视觉上的方便,但是前者在再编码上有优势。
如下例。
<-
css2019a%>%
css2019a mutate(D1 = case_when(
== 1| d4b1_1 == 2 ~ "从不或很少",
d4b1_1 == 3| d4b1_1 == 4 ~ "偶尔",
d4b1_1 == 5| d4b1_1 == 6 ~ "经常"
d4b1_1
))<-
css2019b%>%
css2019b mutate(D1 = case_when(
== "从不"| d4b1_1 == "一年几次"~ "从不或很少",
d4b1_1 == "一月至少一次"| d4b1_1 == "一周至少一次" ~ "偶尔",
d4b1_1 == "一周多次"| d4b1_1 == "几乎每天" ~ "经常",
d4b1_1 ))
1.2 数据简单处理
再编码,根据出生日期计算年龄, 然后对年龄分组。
<- css2019b %>% mutate(age = 2019-a1_1_a)
css2019b <-
css2019b%>%
css2019b mutate(agegroup = case_when(
<= 40 ~ "40岁以下",
age >40 & age <= 60 ~ "40-60",
age > 60 ~ "60以上"
age ))
从数据库中选取一个数据集,便于使用
<-
cssk %>% select(
css2019b
agegroup,=d4a,
是否上网=d4b1_1,
上网浏览时政信息=d4b1_2,
网上娱乐=d4b1_3
上网聊天交友 )
处理缺失值
注:这个drop_na无法处理带既有数值又带标签类型的变量
<-cssk %>%drop_na(agegroup,是否上网)%>% replace(is.na(.), "从不") cssk1
设置为数值型变量
$age <- as.numeric(css2019b$age) css2019b
另一种编码方式,涉及factor和label
<-
cssc %>% select(
css2019b
age,=d4a)
是否上网library(car)
## Loading required package: carData
##
## Attaching package: 'car'
## The following object is masked from 'package:dplyr':
##
## recode
## The following object is masked from 'package:purrr':
##
## some
$age <-
cssc::recode(cssc$age, "0:30='1';31:60='2';61:200='3'")
car$age <-
csscfactor(cssc$age,
levels = c(1, 2, 3),
labels = c("U30", "30-60", "A60"))