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