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