1 工作环境设置

我们通常会将R的工作环境先进行一些设置,这些设置包括了「设定当前工作目录」、 「设定系統中文文字编码」、以及「设定绘图物件中的中文文字」等项。

#呈现code 与output
knitr::opts_chunk$set(echo = TRUE) 
#设定当前工作目录(请选择一个你自己的工作目录)
setwd("/Users/simonfair/Desktop/量化研究数据分析/Ch5变量的编辑管理转换与加权") 
#显示目前工作目录
getwd()
## [1] "/Users/simonfair/Desktop/量化研究数据分析/Ch5变量的编辑管理转换与加权"
#设定系統中文文字編碼 (mac)
Sys.setlocale(category = "LC_ALL", locale = "en_US.UTF-8") #美式英文
## [1] "en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/zh_CN.UTF-8"
Sys.setlocale(category = "LC_ALL", locale = "Zh_TW.UTF-8") #繁体中文
## [1] "Zh_TW.UTF-8/Zh_TW.UTF-8/Zh_TW.UTF-8/C/Zh_TW.UTF-8/zh_CN.UTF-8"
Sys.setlocale(category = "LC_ALL", locale = "zh_CN.UTF-8") #简体中文
## [1] "zh_CN.UTF-8/zh_CN.UTF-8/zh_CN.UTF-8/C/zh_CN.UTF-8/zh_CN.UTF-8"
#载入showtext套件
library(showtext) 
## 载入需要的程辑包:sysfonts
## 载入需要的程辑包:showtextdb
#使绘图物件中的中文文字能正确呈现
showtext_auto(enable = TRUE)

本章學習者須先下載R相關套件,之後方能正常運行 install.packages(“dplyr”) install.packages(“sjlabelled”) install.packages(“sjmisc”) install.packages(“sjPlot”) install.packges(“anesrake”)


2 汇入SPSS调查数据档 sjlabelled::read_spss()

#调用"sjlabelled" 套件
library(sjlabelled)
#将SPSS数据汇入到R(数据档要放在目前的工作目录下)
TCS2015small <- read_spss("TCS2015small.sav") 
#看一下数据档中的前六笔数据
head(TCS2015small)
##           ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 1 T111101006  2    1977     38          3     30    7      1      0    3
## 2 T111101016  2    1968     47          4    180    2      0      5    3
## 3 T111101039  2    1988     27          2      0    7      2      0    2
## 4 T111101040  1    1958     57          5    480    5      0     30    3
## 5 T111101042  2    1958     57          5    120    7      0     10    3
## 6 T111101047  1    1988     27          2    480    7      0     30    2
#存成R数据檔
save(TCS2015small, file = "TCS2015small.rda")
#把R数据档叫进来
load("TCS2015small.rda")

3 对于变量的编辑管理转换

#把R数据档叫进来
load("TCS2015sample.rda")
#检视前6笔观察值
head(TCS2015sample)
##           ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 1 T111101006  2    1977     38          3     30    7      1      0    3
## 2 T111101016  2    1968     47          4    180    2      0      5    3
## 3 T111101039  2    1988     27          2      0    7      2      0    2
## 4 T111101040  1    1958     57          5    480    5      0     30    3
## 5 T111101042  2    1958     57          5    120    7      0     10    3
## 6 T111101047  1    1988     27          2    480    7      0     30    2

3.1 移动变量的位置sjmisc::move_columns

可以调用“sjmisc”套件中的“move_columns()”函数,将变量在数据档的位置,进行移动到某 个变量之前或之后。

3.1.1 sjmisc::move_columns(,.before)

将变量移动到某一个变量之前

library(sjmisc)
#将数据档(TCS2015sample)的V1.1变量,移动(move_columns)到G1.1.A变量之前(.before),
#并另存新档(TCS2015sample.move )
TCS2015sample.move <- move_columns(TCS2015sample, V1.1, .before = "G1.1.A") 
#呈现数据档*TCS2015sample.move)前面6个观察值,所有变量
head(TCS2015sample.move) 
##           ID A1 A2.year A2.age age_strata V1.1 G1.1.A G4.2 G4.3.1 G4.3.2
## 1 T111101006  2    1977     38          3    3     30    7      1      0
## 2 T111101016  2    1968     47          4    3    180    2      0      5
## 3 T111101039  2    1988     27          2    2      0    7      2      0
## 4 T111101040  1    1958     57          5    3    480    5      0     30
## 5 T111101042  2    1958     57          5    3    120    7      0     10
## 6 T111101047  1    1988     27          2    2    480    7      0     30

3.1.2 sjmisc::move_columns(,.after)

将变量移动到某一个变量之后

library(sjmisc)
#将数据档(TCS2015sample)的V1.1变量,移动(move_columns)到G1.1.A变量之后(.after)
#并另存新档(TCS2015sample.move )
TCS2015sample.move <- move_columns(TCS2015sample, V1.1, .after = "G1.1.A") 
#调用"sjPlot" 套件
#呈现数据档*TCS2015sample.move)前面6个观察值,所有变量
head(TCS2015sample.move) 
##           ID A1 A2.year A2.age age_strata G1.1.A V1.1 G4.2 G4.3.1 G4.3.2
## 1 T111101006  2    1977     38          3     30    3    7      1      0
## 2 T111101016  2    1968     47          4    180    3    2      0      5
## 3 T111101039  2    1988     27          2      0    2    7      2      0
## 4 T111101040  1    1958     57          5    480    3    5      0     30
## 5 T111101042  2    1958     57          5    120    3    7      0     10
## 6 T111101047  1    1988     27          2    480    2    7      0     30

3.2 重新命名变量的名称 sjmisc::rename_variables()

可以调用“sjmisc”套件中的“rename_variables()”函数,更改变量的名称。

library(sjmisc)
#将数据档(TCS2015sample)的A1变量,重新命名(rename_variables)为"sex",
#并另存新档(TCS2015sample.rename)
TCS2015sample.rename <- rename_variables(TCS2015sample, A1 = "sex")
#呈现数据档(TCS2015sample.rename)前面6个观察值,所有变量
head(TCS2015sample.rename) 
##           ID sex A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 1 T111101006   2    1977     38          3     30    7      1      0    3
## 2 T111101016   2    1968     47          4    180    2      0      5    3
## 3 T111101039   2    1988     27          2      0    7      2      0    2
## 4 T111101040   1    1958     57          5    480    5      0     30    3
## 5 T111101042   2    1958     57          5    120    7      0     10    3
## 6 T111101047   1    1988     27          2    480    7      0     30    2

3.3 查找变量 sjmisc::find_var()

可以调用“sjmisc”套件中的“find_var()”函数,寻找“变量名称”(var.name)或“变量标签” (var.label)中包含某个“特定名称”的变量。

#调用"sjmisc"套件
library(sjmisc)
#寻找变量名称var.name 或 变量标签var.label包含"age"的变量
find_var(TCS2015sample, "age", search = "all") 
##   col.nr   var.name var.label
## 1      4     A2.age      年龄
## 2      5 age_strata  年龄分层
#寻找变量名称var.name 或 变量标签var.label包含"年龄"的变量
find_var(TCS2015sample, "年龄", search = "all")
##   col.nr   var.name var.label
## 1      4     A2.age      年龄
## 2      5 age_strata  年龄分层
#寻找变量名称var.name 或 变量标签var.label包含"G"的变量
find_var(TCS2015sample, "G", search = "all")
##   col.nr var.name                                                     var.label
## 1      6   G1.1.A             G1.1.A.你每天利用电脑上网工作、学习的时间有多久?
## 2      7     G4.2                          G4.2. 请问你一周会使用社交媒体几天?
## 3      8   G4.3.1  G4.3. 请问在你有使用社交媒体的那一天,你大约会使用多久?(时)
## 4      9   G4.3.2 G4.3. 請问在你有使用社交媒体的那一天,你大约会使用多久?(分)
#寻找变量名称var.name 或 变量标签var.label包含"社交媒体"的变量
find_var(TCS2015sample, "社交媒体", search = "all")
##   col.nr var.name                                                     var.label
## 1      7     G4.2                          G4.2. 请问你一周会使用社交媒体几天?
## 2      8   G4.3.1  G4.3. 请问在你有使用社交媒体的那一天,你大约会使用多久?(时)
## 3      9   G4.3.2 G4.3. 請问在你有使用社交媒体的那一天,你大约会使用多久?(分)
#寻找变量名称var.name 或变量标签var.label包含"满意"的变量,
#并将找到的变量另存新档,名称设置为"mydf"
mydf <- find_var(TCS2015sample, "满意", search = "all", out = "df")
#频数分布
frq(mydf)
## 
## V1.1. 整体而言,你对于你的生活满不满意 (V1.1) <numeric>
## # total N=100  valid N=100  mean=2.74  sd=0.52
## 
## Value |      Label |  N | Raw % | Valid % | Cum. %
## --------------------------------------------------
##     1 | 非常不满意 |  2 |     2 |       2 |      2
##     2 |     不满意 | 24 |    24 |      24 |     26
##     3 |       满意 | 72 |    72 |      72 |     98
##     4 |   非常满意 |  2 |     2 |       2 |    100
##  <NA> |       <NA> |  0 |     0 |    <NA> |   <NA>

3.4 删除变量 sjmisc::remove_var()

可以调用“sjmisc”套件中的“remove_var()”函数,删除特定变量。

#呈现数据档(TCS2015sample)前面6个观察值,所有变量
head(TCS2015sample) #10个变量
##           ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 1 T111101006  2    1977     38          3     30    7      1      0    3
## 2 T111101016  2    1968     47          4    180    2      0      5    3
## 3 T111101039  2    1988     27          2      0    7      2      0    2
## 4 T111101040  1    1958     57          5    480    5      0     30    3
## 5 T111101042  2    1958     57          5    120    7      0     10    3
## 6 T111101047  1    1988     27          2    480    7      0     30    2
#调用"sjmisc"套件
library(sjmisc)
#删除TCS2015sample资料档中的"age_strata"变量,并另存新档(TCS2015sample_remvar) 
TCS2015sample.remvar <- remove_var(TCS2015sample, "age_strata")
## Warning: `select_vars()` was deprecated in dplyr 0.8.4.
## Please use `tidyselect::vars_select()` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was generated.
#呈现数据档(TCS2015sample.remvar)前面6个观察值,所有变量
head(TCS2015sample.remvar)#剩下9个变量(原本的"age_strata"变量已经被删除了)
##           ID A1 A2.year A2.age G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 1 T111101006  2    1977     38     30    7      1      0    3
## 2 T111101016  2    1968     47    180    2      0      5    3
## 3 T111101039  2    1988     27      0    7      2      0    2
## 4 T111101040  1    1958     57    480    5      0     30    3
## 5 T111101042  2    1958     57    120    7      0     10    3
## 6 T111101047  1    1988     27    480    7      0     30    2

3.5 挑选特定变量 dplyr::select()

#调用"dplyr"套件
library(dplyr)
## 
## 载入程辑包:'dplyr'
## The following object is masked from 'package:sjlabelled':
## 
##     as_label
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
#将TCS2015sample数据档中的A1,age_strata变量,单独挑选出来(select)
#呈现前6笔数据
head(select(TCS2015sample, A1,age_strata))
##   A1 age_strata
## 1  2          3
## 2  2          4
## 3  2          2
## 4  1          5
## 5  2          5
## 6  1          2
#挑选变量名称以"A"为开头的变量(不分大小写),并呈现前6笔数据
head(select(TCS2015sample,starts_with("A")))
##   A1 A2.year A2.age age_strata
## 1  2    1977     38          3
## 2  2    1968     47          4
## 3  2    1988     27          2
## 4  1    1958     57          5
## 5  2    1958     57          5
## 6  1    1988     27          2
#挑选变量名称以"A"为结尾的变量(不分大小写),并呈现前6笔数据
head(select(TCS2015sample,ends_with("A")))
##   age_strata G1.1.A
## 1          3     30
## 2          4    180
## 3          2      0
## 4          5    480
## 5          5    120
## 6          2    480
#挑选变量名称包含"A"的变量(不分大小写),并呈现前6笔数据
head(select(TCS2015sample, contains("A")))
##   A1 A2.year A2.age age_strata G1.1.A
## 1  2    1977     38          3     30
## 2  2    1968     47          4    180
## 3  2    1988     27          2      0
## 4  1    1958     57          5    480
## 5  2    1958     57          5    120
## 6  1    1988     27          2    480

3.6 重新编码 sjmisc::rec()与检查编码的正确性 dplyr::select()

可以调用“sjmisc”套件中的“rec()”函数,将原始变量重新编码为另一新的变量。

load("TCS2015sample.rda")
#调用"sjmisc"套件
library(sjmisc)
#频数分布:方法一(sjmisc::frq)
frq(TCS2015sample$A2.age)
## 
## 年龄 (x) <numeric>
## # total N=100  valid N=100  mean=47.13  sd=16.98
## 
## Value | N | Raw % | Valid % | Cum. %
## ------------------------------------
##    19 | 3 |     3 |       3 |   3.00
##    20 | 1 |     1 |       1 |   4.00
##    21 | 2 |     2 |       2 |   6.00
##    22 | 2 |     2 |       2 |   8.00
##    23 | 1 |     1 |       1 |   9.00
##    24 | 2 |     2 |       2 |  11.00
##    25 | 1 |     1 |       1 |  12.00
##    26 | 2 |     2 |       2 |  14.00
##    27 | 3 |     3 |       3 |  17.00
##    29 | 3 |     3 |       3 |  20.00
##    30 | 1 |     1 |       1 |  21.00
##    31 | 2 |     2 |       2 |  23.00
##    32 | 2 |     2 |       2 |  25.00
##    33 | 1 |     1 |       1 |  26.00
##    34 | 2 |     2 |       2 |  28.00
##    35 | 1 |     1 |       1 |  29.00
##    36 | 1 |     1 |       1 |  30.00
##    37 | 6 |     6 |       6 |  36.00
##    38 | 3 |     3 |       3 |  39.00
##    39 | 1 |     1 |       1 |  40.00
##    41 | 1 |     1 |       1 |  41.00
##    42 | 1 |     1 |       1 |  42.00
##    44 | 1 |     1 |       1 |  43.00
##    46 | 3 |     3 |       3 |  46.00
##    47 | 1 |     1 |       1 |  47.00
##    48 | 3 |     3 |       3 |  50.00
##    49 | 4 |     4 |       4 |  54.00
##    50 | 2 |     2 |       2 |  56.00
##    51 | 3 |     3 |       3 |  59.00
##    53 | 1 |     1 |       1 |  60.00
##    55 | 1 |     1 |       1 |  61.00
##    56 | 3 |     3 |       3 |  64.00
##    57 | 5 |     5 |       5 |  69.00
##    58 | 1 |     1 |       1 |  70.00
##    59 | 3 |     3 |       3 |  73.00
##    60 | 2 |     2 |       2 |  75.00
##    61 | 3 |     3 |       3 |  78.00
##    62 | 5 |     5 |       5 |  83.00
##    63 | 3 |     3 |       3 |  86.00
##    65 | 2 |     2 |       2 |  88.00
##    66 | 1 |     1 |       1 |  89.00
##    68 | 2 |     2 |       2 |  91.00
##    71 | 1 |     1 |       1 |  92.00
##    73 | 1 |     1 |       1 |  93.00
##    74 | 1 |     1 |       1 |  94.00
##    75 | 1 |     1 |       1 |  95.00
##    76 | 1 |     1 |       1 |  96.00
##    80 | 2 |     2 |       2 |  98.00
##    82 | 1 |     1 |       1 |  99.00
##    85 | 1 |     1 |       1 | 100.00
##  <NA> | 0 |     0 |    <NA> |   <NA>
#频数分布:方法二(base::table)
table(TCS2015sample$A2.age, useNA = "always") #呈现缺失值
## 
##   19   20   21   22   23   24   25   26   27   29   30   31   32   33   34   35 
##    3    1    2    2    1    2    1    2    3    3    1    2    2    1    2    1 
##   36   37   38   39   41   42   44   46   47   48   49   50   51   53   55   56 
##    1    6    3    1    1    1    1    3    1    3    4    2    3    1    1    3 
##   57   58   59   60   61   62   63   65   66   68   71   73   74   75   76   80 
##    5    1    3    2    3    5    3    2    1    2    1    1    1    1    1    2 
##   82   85 <NA> 
##    1    1    0
#重新编码(sjmisc::rec)
#将原始变量(A2.age)依照我们的编码规则(18:29=1; 30:39=2; 40:49=3; 50:59=4; #60:max=5),重新编码(rec)为另一新的变量(A2.age.cat5),并给予变量名称(var.label)
#和变量标签名称(val.labels)。将新的变量(A2.age.cat5)设置为类别变量(as.num=FALSE)
TCS2015sample$A2.age.cat5 <- rec(TCS2015sample$A2.age, 
                      rec =  "18:29=1; 30:39=2; 40:49=3; 50:59=4; 60:max=5" ,
                      var.label = "年龄五分类",
                      val.labels = c("18-29岁", "30-39岁", "40-49岁", "50-59岁",
                                     "60岁以上"),
                      as.num = FALSE
                      )
#做新变量(A2.age.cat5)的频数分布
frq(TCS2015sample$A2.age.cat5)
## 
## 年龄五分类 (x) <categorical>
## # total N=100  valid N=100  mean=3.13  sd=1.51
## 
## Value |    Label |  N | Raw % | Valid % | Cum. %
## ------------------------------------------------
##     1 |  18-29岁 | 20 | 20.00 |   20.00 |     20
##     2 |  30-39岁 | 20 | 20.00 |   20.00 |     40
##     3 |  40-49岁 | 14 | 14.00 |   14.00 |     54
##     4 |  50-59岁 | 19 | 19.00 |   19.00 |     73
##     5 | 60岁以上 | 27 | 27.00 |   27.00 |    100
##  <NA> |     <NA> |  0 |  0.00 |    <NA> |   <NA>

可以调用“dplyr”套件中的“select()”函数,检查重新编码的正确性 或 调用“sjmisc”套件中的“flat_table()”函数,检查重新编码的正确性。

#检查重新编码的正确性:方法一(dplyr::select)
library(dplyr)
select(TCS2015sample,A2.age, A2.age.cat5)
##     A2.age A2.age.cat5
## 1       38           2
## 2       47           3
## 3       27           1
## 4       57           4
## 5       57           4
## 6       27           1
## 7       59           4
## 8       36           2
## 9       61           5
## 10      80           5
## 11      51           4
## 12      37           2
## 13      38           2
## 14      63           5
## 15      71           5
## 16      55           4
## 17      56           4
## 18      19           1
## 19      20           1
## 20      37           2
## 21      29           1
## 22      37           2
## 23      22           1
## 24      58           4
## 25      46           3
## 26      57           4
## 27      37           2
## 28      39           2
## 29      68           5
## 30      24           1
## 31      61           5
## 32      33           2
## 33      29           1
## 34      46           3
## 35      35           2
## 36      31           2
## 37      63           5
## 38      50           4
## 39      80           5
## 40      51           4
## 41      56           4
## 42      46           3
## 43      49           3
## 44      53           4
## 45      50           4
## 46      22           1
## 47      31           2
## 48      66           5
## 49      48           3
## 50      27           1
## 51      23           1
## 52      49           3
## 53      65           5
## 54      73           5
## 55      62           5
## 56      24           1
## 57      19           1
## 58      57           4
## 59      62           5
## 60      26           1
## 61      21           1
## 62      65           5
## 63      51           4
## 64      25           1
## 65      48           3
## 66      42           3
## 67      29           1
## 68      30           2
## 69      21           1
## 70      61           5
## 71      44           3
## 72      34           2
## 73      48           3
## 74      19           1
## 75      59           4
## 76      49           3
## 77      75           5
## 78      62           5
## 79      26           1
## 80      32           2
## 81      76           5
## 82      41           3
## 83      82           5
## 84      60           5
## 85      62           5
## 86      32           2
## 87      68           5
## 88      85           5
## 89      59           4
## 90      49           3
## 91      56           4
## 92      37           2
## 93      34           2
## 94      74           5
## 95      63           5
## 96      60           5
## 97      37           2
## 98      57           4
## 99      62           5
## 100     38           2
#检查重新编码的正确性:方法二(sjmisc::flat_table)
library(sjmisc)
flat_table(TCS2015sample,A2.age, A2.age.cat5)
##        A2.age.cat5 18-29岁 30-39岁 40-49岁 50-59岁 60岁以上
## A2.age                                                     
## 19                       3       0       0       0        0
## 20                       1       0       0       0        0
## 21                       2       0       0       0        0
## 22                       2       0       0       0        0
## 23                       1       0       0       0        0
## 24                       2       0       0       0        0
## 25                       1       0       0       0        0
## 26                       2       0       0       0        0
## 27                       3       0       0       0        0
## 29                       3       0       0       0        0
## 30                       0       1       0       0        0
## 31                       0       2       0       0        0
## 32                       0       2       0       0        0
## 33                       0       1       0       0        0
## 34                       0       2       0       0        0
## 35                       0       1       0       0        0
## 36                       0       1       0       0        0
## 37                       0       6       0       0        0
## 38                       0       3       0       0        0
## 39                       0       1       0       0        0
## 41                       0       0       1       0        0
## 42                       0       0       1       0        0
## 44                       0       0       1       0        0
## 46                       0       0       3       0        0
## 47                       0       0       1       0        0
## 48                       0       0       3       0        0
## 49                       0       0       4       0        0
## 50                       0       0       0       2        0
## 51                       0       0       0       3        0
## 53                       0       0       0       1        0
## 55                       0       0       0       1        0
## 56                       0       0       0       3        0
## 57                       0       0       0       5        0
## 58                       0       0       0       1        0
## 59                       0       0       0       3        0
## 60                       0       0       0       0        2
## 61                       0       0       0       0        3
## 62                       0       0       0       0        5
## 63                       0       0       0       0        3
## 65                       0       0       0       0        2
## 66                       0       0       0       0        1
## 68                       0       0       0       0        2
## 71                       0       0       0       0        1
## 73                       0       0       0       0        1
## 74                       0       0       0       0        1
## 75                       0       0       0       0        1
## 76                       0       0       0       0        1
## 80                       0       0       0       0        2
## 82                       0       0       0       0        1
## 85                       0       0       0       0        1

3.7 将连续变量进行二分编码 sjmisc::dicho()

可以调用“sjmisc”套件中的“remove_dicho()”函数,将某一特定连续变量,依据特定标准, 进行二分编码。

#将TCS2015sample$A2.age变量,根据A2.age=40分为两组
#一组为40(含)以下,另一组为40(不含)以上
#分别设置变量标签(var.label),与变量值标签(val.labels)
#将二分编码后的变量,重新设置为新的变量名称(A2.age.dicho)
TCS2015sample$A2.age.dicho <- dicho(TCS2015sample$A2.age, dich.by = 40,
      var.label = "年龄二分类",
      val.labels = c("40(含)以下", "41以上"),
      append = FALSE)
#二分编码后的频数分布
frq(TCS2015sample$A2.age.dicho )
## 
## 年龄二分类 (x) <categorical>
## # total N=100  valid N=100  mean=0.60  sd=0.49
## 
## Value |       Label |  N | Raw % | Valid % | Cum. %
## ---------------------------------------------------
##     0 | 40(含)以下 | 40 |    40 |      40 |     40
##     1 |      41以上 | 60 |    60 |      60 |    100
##  <NA> |        <NA> |  0 |     0 |    <NA> |   <NA>

3.8 创建新变量 sjmisc::add_variables(); dplyr::mutate()

3.8.1 方法一 sjmisc::add_variables()

可以调用“sjmisc”套件中的“add_variables()”函数,依据特定运算规则,创建新变量。

#调用simisc套件
library(sjmisc) 
#在TCS2015sample资料档,增加一个新变量名称为"new_var",数值为"3",
#新变量的位置放在 "V1.1"变量之后。
#回存原数据档(TCS2015sample)
TCS2015sample<- add_variables(TCS2015sample, new_var1 = 3, .after = "V1.1")
#呈现前面6个观察值,所有变量
head(TCS2015sample) 
##           ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 1 T111101006  2    1977     38          3     30    7      1      0    3
## 2 T111101016  2    1968     47          4    180    2      0      5    3
## 3 T111101039  2    1988     27          2      0    7      2      0    2
## 4 T111101040  1    1958     57          5    480    5      0     30    3
## 5 T111101042  2    1958     57          5    120    7      0     10    3
## 6 T111101047  1    1988     27          2    480    7      0     30    2
##   new_var1 A2.age.cat5 A2.age.dicho
## 1        3           2            0
## 2        3           3            1
## 3        3           1            0
## 4        3           4            1
## 5        3           4            1
## 6        3           1            0
#新变量的位置放在 "V1.1"变量之前。回存原数据档(TCS2015sample)
TCS2015sample <- add_variables(TCS2015sample, new_var2 = 4, .before = "V1.1")
#呈现数据档(TCS2015sample)前面6个观察值,所有变量
head(TCS2015sample)
##           ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 new_var2
## 1 T111101006  2    1977     38          3     30    7      1      0        4
## 2 T111101016  2    1968     47          4    180    2      0      5        4
## 3 T111101039  2    1988     27          2      0    7      2      0        4
## 4 T111101040  1    1958     57          5    480    5      0     30        4
## 5 T111101042  2    1958     57          5    120    7      0     10        4
## 6 T111101047  1    1988     27          2    480    7      0     30        4
##   V1.1 new_var1 A2.age.cat5 A2.age.dicho
## 1    3        3           2            0
## 2    3        3           3            1
## 3    2        3           1            0
## 4    3        3           4            1
## 5    3        3           4            1
## 6    2        3           1            0

3.8.2 方法二 dplyr::mutate()

也可以调用“dplyr”套件中的“mutate()”函数,依据特定运算规则,创建新变量。

#调用"dplyr"套件
library(dplyr)
#新增一个变量(smuse2_min_day)其值为根据某种特定运算规则而得(G4.3.1*60 + G4.3.2)
#将新建变量(smuse2_min_day)回存到原始的数据档(TCS2015sample)
TCS2015sample <- mutate(TCS2015sample, smuse2_min_day = G4.3.1*60 + G4.3.2)
#呈现数据档(TCS2015sample)前面6个观察值,所有变量
head(TCS2015sample) #新增的变量(smuse2_min_day)会放在整个数据档的最后面
##           ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 new_var2
## 1 T111101006  2    1977     38          3     30    7      1      0        4
## 2 T111101016  2    1968     47          4    180    2      0      5        4
## 3 T111101039  2    1988     27          2      0    7      2      0        4
## 4 T111101040  1    1958     57          5    480    5      0     30        4
## 5 T111101042  2    1958     57          5    120    7      0     10        4
## 6 T111101047  1    1988     27          2    480    7      0     30        4
##   V1.1 new_var1 A2.age.cat5 A2.age.dicho smuse2_min_day
## 1    3        3           2            0             60
## 2    3        3           3            1              5
## 3    2        3           1            0            120
## 4    3        3           4            1             30
## 5    3        3           4            1             10
## 6    2        3           1            0             30

3.9 增加id变量 sjmisc::add_id()

可以调用“sjmisc”套件中的“add_id()”函数,创建观察值的id变量

#使用sjmisc套件的"add_id"函数,并将观察值id变量的名称,设置为"ID_user" 
#id变量默认放在第一个column,并回存原始数据档
TCS2015sample <- add_id(TCS2015sample, var = "ID_user") 
#呈现数据档(TCS2015sample)前面6个观察值,前面10个变量
head(TCS2015sample[,1:10]) #新增的变量(ID_user)会放在整个数据档的最前面
##   ID_user         ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2
## 1       1 T111101006  2    1977     38          3     30    7      1      0
## 2       2 T111101016  2    1968     47          4    180    2      0      5
## 3       3 T111101039  2    1988     27          2      0    7      2      0
## 4       4 T111101040  1    1958     57          5    480    5      0     30
## 5       5 T111101042  2    1958     57          5    120    7      0     10
## 6       6 T111101047  1    1988     27          2    480    7      0     30

3.10 制造虚拟变量 sjmisc::to_dummy()

可以调用“sjmisc”套件中的“to_dummy()”函数,根据某一类别变量的“类别数目”,创建出 相对应的“虚拟变量数目”。

#载入R数据档
load("TCS2015sample.rda")
#调用simisc套件
library(sjmisc)
#做频数分布,察看有几类
frq(TCS2015sample$V1.1)#有4类
## 
## V1.1. 整体而言,你对于你的生活满不满意 (x) <numeric>
## # total N=100  valid N=100  mean=2.74  sd=0.52
## 
## Value |      Label |  N | Raw % | Valid % | Cum. %
## --------------------------------------------------
##     1 | 非常不满意 |  2 |     2 |       2 |      2
##     2 |     不满意 | 24 |    24 |      24 |     26
##     3 |       满意 | 72 |    72 |      72 |     98
##     4 |   非常满意 |  2 |     2 |       2 |    100
##  <NA> |       <NA> |  0 |     0 |    <NA> |   <NA>
#将类别变量(A2.age.cat5),创建相对应的虚拟变量(to_dummy),虚拟变量名称(var.name)
#以"dummy"作为开头。所产生的虚拟变量,另存新档(TCS2015sample.dummy)
TCS2015sample.dummy <- to_dummy(TCS2015sample$V1.1, var.name = "dummy")
head(TCS2015sample.dummy) #4个虚拟变量
##   dummy_1 dummy_2 dummy_3 dummy_4
## 1       0       0       1       0
## 2       0       0       1       0
## 3       0       1       0       0
## 4       0       0       1       0
## 5       0       0       1       0
## 6       0       1       0       0
#调用dplyr套件
library(dplyr)
#将原始数据档(TCS2015sample)与虚拟变量数据档(TCS2015sample.dummy)
#进行变量合并(bind_cols)
mydf2_bind_cols <- bind_cols(TCS2015sample, TCS2015sample.dummy)
#呈现合并数据档(mydf2_bind_cols)前面6个观察值,全部变量
head(mydf2_bind_cols) 
##           ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 1 T111101006  2    1977     38          3     30    7      1      0    3
## 2 T111101016  2    1968     47          4    180    2      0      5    3
## 3 T111101039  2    1988     27          2      0    7      2      0    2
## 4 T111101040  1    1958     57          5    480    5      0     30    3
## 5 T111101042  2    1958     57          5    120    7      0     10    3
## 6 T111101047  1    1988     27          2    480    7      0     30    2
##   dummy_1 dummy_2 dummy_3 dummy_4
## 1       0       0       1       0
## 2       0       0       1       0
## 3       0       1       0       0
## 4       0       0       1       0
## 5       0       0       1       0
## 6       0       1       0       0

3.11 计算次数 sjmisc::row_count()

可以调用“sjmisc”套件中的“row_count()”函数,计算特定观察值(例如:value=1)在不同 变量(例如:A1.rec,age.strata.rec)出现的次数。

#频数分布
frq(TCS2015sample$A1)
## 
## 性别 (x) <numeric>
## # total N=100  valid N=100  mean=1.42  sd=0.50
## 
## Value | Label |  N | Raw % | Valid % | Cum. %
## ---------------------------------------------
##     1 |    男 | 58 | 58.00 |   58.00 |  58.00
##     2 |    女 | 42 | 42.00 |   42.00 | 100.00
##  <NA> |  <NA> |  0 |  0.00 |    <NA> |   <NA>
frq(TCS2015sample$age_strata)
## 
## 年龄分层 (x) <numeric>
## # total N=100  valid N=100  mean=4.19  sd=1.69
## 
## Value |  Label |  N | Raw % | Valid % | Cum. %
## ----------------------------------------------
##     1 |  18-19 |  3 |  3.00 |    3.00 |      3
##     2 |  20-29 | 17 | 17.00 |   17.00 |     20
##     3 |  30-39 | 20 | 20.00 |   20.00 |     40
##     4 |  40-49 | 14 | 14.00 |   14.00 |     54
##     5 |  50-59 | 19 | 19.00 |   19.00 |     73
##     6 |  60-69 | 18 | 18.00 |   18.00 |     91
##     7 | 70以上 |  9 |  9.00 |    9.00 |    100
##  <NA> |   <NA> |  0 |  0.00 |    <NA> |   <NA>
#调用"sjmisc"套件的"rec"函数,将A1变量重新编码为一个二分类变量A1.rec
library(sjmisc)
TCS2015sample$A1.rec <- rec(TCS2015sample$A1, 
                            rec =  "1=1; else=0" ,
                            var.label = "性别",
                            val.labels = c("0:女性", "1:男性"),
                            as.num = FALSE
                            )
frq(TCS2015sample$A1.rec)
## 
## 性别 (x) <categorical>
## # total N=100  valid N=100  mean=0.58  sd=0.50
## 
## Value |  Label |  N | Raw % | Valid % | Cum. %
## ----------------------------------------------
##     0 | 0:女性 | 42 | 42.00 |   42.00 |     42
##     1 | 1:男性 | 58 | 58.00 |   58.00 |    100
##  <NA> |   <NA> |  0 |  0.00 |    <NA> |   <NA>
#调用"sjmisc"套件的"rec"函数,将aga_strata变量重新编码为一个二分类变量
#age.strata.rec
TCS2015sample$age.strata.rec <- rec(TCS2015sample$age_strata, 
                                    rec =  "4:7=1; else=0" ,
                                    var.label = "年龄二分",
                                    val.labels = c("40(不含)以下", "40(含)以上"),
                                    as.num = FALSE
                                    )
frq(TCS2015sample$age.strata.rec)
## 
## 年龄二分 (x) <categorical>
## # total N=100  valid N=100  mean=0.60  sd=0.49
## 
## Value |        Label |  N | Raw % | Valid % | Cum. %
## ----------------------------------------------------
##     0 | 40(不含)以下 | 40 |    40 |      40 |     40
##     1 |   40(含)以上 | 60 |    60 |      60 |    100
##  <NA> |         <NA> |  0 |     0 |    <NA> |   <NA>
#多变量多重取值的次数计算
#将TCS2015sample数据档中的A1.rec变量与age.strata.rec两变量,挑出来(select)
#计算两变量等于1的出现次数(count=1),给予档名(rowcount),
#并另存新档(TCS2015sample_count) 
library(sjmisc)
TCS2015sample_count <- TCS2015sample %>%
  select(A1.rec, age.strata.rec) %>%
  row_count(count = 1, append = TRUE) #A1=1, age_strata=1的出现次数
#呈现数据档(TCS2015sample_count)前面6个观察值,所有变量
head(TCS2015sample_count)
##   A1.rec age.strata.rec rowcount
## 1      0              0        0
## 2      0              1        1
## 3      0              0        0
## 4      1              1        2
## 5      0              1        1
## 6      1              0        1
#呈现次数变量(rowcount)的频数分布
frq(TCS2015sample_count$rowcount) 
## 
## x <integer>
## # total N=100  valid N=100  mean=1.18  sd=0.72
## 
## Value |  N | Raw % | Valid % | Cum. %
## -------------------------------------
##     0 | 18 |    18 |      18 |     18
##     1 | 46 |    46 |      46 |     64
##     2 | 36 |    36 |      36 |    100
##  <NA> |  0 |     0 |    <NA> |   <NA>
#(结果发现):
#A1.rec不等于1 且age.strata.rec不等于1的观察值(value=0)有18个
#A1.rec等于1 或age.strata.rec等于1的观察值(value=1)有46个
#A1.rec等于1 且age.strata.rec等于1的观察值(value=2)有36个

3.12 排名 dplyr::min_rank();dplyr::percent_rank()

可以调用“dplyr”套件中的 “min_rank()” 做数据大小排名。 也可以调用“dplyr”套件中的 “percent_rank()”做百分位排名。

#载入R数据档
load("TCS2015sample.rda")
library(dplyr)
#将TCS2015sample数据档中的A2.age变量挑出来,另存新档(TCS2015sample.subset)
TCS2015sample.subset <- select(TCS2015sample, ID, A2.age)
#看前六笔数据
head(TCS2015sample.subset)
##           ID A2.age
## 1 T111101006     38
## 2 T111101016     47
## 3 T111101039     27
## 4 T111101040     57
## 5 T111101042     57
## 6 T111101047     27
#将A2.age变量由大到小排序(dplyr::arrange(,desc())
library(dplyr)
TCS2015sample.subset <- arrange(TCS2015sample.subset, desc(A2.age))
head(TCS2015sample.subset)
##           ID A2.age
## 1 T112204216     85
## 2 T112204191     82
## 3 T111101089     80
## 4 T111202196     80
## 5 T112204173     76
## 6 T112204146     75

3.12.1 dplyr::min_rank(desc()) 数据大小排名方法一(一般用这个方法进行排名)

#数值最大,排名最前(一般用这个方法排序)
library(dplyr)
#A2.age变量的最大数值,排名最前 min_rank(desc()),
#并将排名后的结果,回存原数据并给予变量名称(rank1)
TCS2015sample.subset$rank1 <- min_rank(desc(TCS2015sample.subset$A2.age))
#呈现数值排名后的前面6笔观察值
head(select(TCS2015sample.subset, ID, A2.age, rank1))
##           ID A2.age rank1
## 1 T112204216     85     1
## 2 T112204191     82     2
## 3 T111101089     80     3
## 4 T111202196     80     3
## 5 T112204173     76     5
## 6 T112204146     75     6

3.12.2 dplyr::min_rank() 数据大小排名方法二

library(dplyr)
#A2.age变量的最大数值,排名最后 min_rank()
#并将排名后的结果,回存原数据并给予变量名称(rank2)
TCS2015sample.subset$rank2 <- min_rank(TCS2015sample.subset$A2.age)
#呈现数值排名后的前面6笔观察值
head(select(TCS2015sample.subset, ID, A2.age, rank2))
##           ID A2.age rank2
## 1 T112204216     85   100
## 2 T112204191     82    99
## 3 T111101089     80    97
## 4 T111202196     80    97
## 5 T112204173     76    96
## 6 T112204146     75    95

3.12.3 dplyr::percent_rank(desc()) 百分位排名方法一

library(dplyr)
#A2.age变量的最大数值,给予最小百分位排名 percent_rank(desc())
#并将排名后的结果,回存原数据并给予变量名称(rank1.pct)
TCS2015sample.subset$rank1.pct <- percent_rank(desc(TCS2015sample.subset$A2.age))
#呈现百分位排名后的前面6笔观察值
head(select(TCS2015sample.subset, ID, A2.age, rank1.pct))
##           ID A2.age  rank1.pct
## 1 T112204216     85 0.00000000
## 2 T112204191     82 0.01010101
## 3 T111101089     80 0.02020202
## 4 T111202196     80 0.02020202
## 5 T112204173     76 0.04040404
## 6 T112204146     75 0.05050505

3.12.4 dplyr::percent_rank() 百分位排名方法二

library(dplyr)
#A2.age变量的最大数值,给予最大百分位排名 percent_rank()
#并将排名后的结果,回存原数据并给予变量名称(rank2.pct)
TCS2015sample.subset$rank2.pct <- percent_rank(TCS2015sample.subset$A2.age)
#呈现百分比排名后的前面6笔观察值
head(select(TCS2015sample.subset, A2.age, rank2.pct))
##   A2.age rank2.pct
## 1     85 1.0000000
## 2     82 0.9898990
## 3     80 0.9696970
## 4     80 0.9696970
## 5     76 0.9595960
## 6     75 0.9494949
#呈现不同排名方法结果的比较
head(TCS2015sample.subset)
##           ID A2.age rank1 rank2  rank1.pct rank2.pct
## 1 T112204216     85     1   100 0.00000000 1.0000000
## 2 T112204191     82     2    99 0.01010101 0.9898990
## 3 T111101089     80     3    97 0.02020202 0.9696970
## 4 T111202196     80     3    97 0.02020202 0.9696970
## 5 T112204173     76     5    96 0.04040404 0.9595960
## 6 T112204146     75     6    95 0.05050505 0.9494949

3.13 设定缺失值 sjmisc::set_na(); 取代缺失值 sjmisc::replace_na()

可以调用“sjmisc”套件中的 “set_na”函数, 将特定数值设置为缺失值。 也可使用“sjmisc”套件的“replace_na”函数将缺失值以某一数值代入。

#载入R数据档
load("TCS2015sample.rda")
#调用"sjmisc"套件
library(sjmisc)
#频数分布
frq(TCS2015sample$G1.1.A) #缺失值(NA)有18个
## 
## G1.1.A.你每天利用电脑上网工作、学习的时间有多久? (x) <numeric>
## # total N=100  valid N=82  mean=215.37  sd=207.48
## 
## Value |  N | Raw % | Valid % | Cum. %
## -------------------------------------
##     0 | 22 | 22.00 |   26.83 |  26.83
##    20 |  1 |  1.00 |    1.22 |  28.05
##    30 |  6 |  6.00 |    7.32 |  35.37
##    60 |  5 |  5.00 |    6.10 |  41.46
##    90 |  1 |  1.00 |    1.22 |  42.68
##   120 |  5 |  5.00 |    6.10 |  48.78
##   180 |  4 |  4.00 |    4.88 |  53.66
##   240 |  4 |  4.00 |    4.88 |  58.54
##   270 |  1 |  1.00 |    1.22 |  59.76
##   300 |  7 |  7.00 |    8.54 |  68.29
##   360 |  5 |  5.00 |    6.10 |  74.39
##   420 |  3 |  3.00 |    3.66 |  78.05
##   480 | 12 | 12.00 |   14.63 |  92.68
##   540 |  2 |  2.00 |    2.44 |  95.12
##   600 |  3 |  3.00 |    3.66 |  98.78
##   720 |  1 |  1.00 |    1.22 | 100.00
##  <NA> | 18 | 18.00 |    <NA> |   <NA>

3.13.1 sjmisc::set_na()

#将TCS2015sample数据档G1.1.A变量的数值代码"0",设置为缺失值(set_na),
#并另存为新的变量名称G1.1.A.na
TCS2015sample$G1.1.A.na <- set_na(TCS2015sample$G1.1.A, na = "0")
#呈现新变量G1.1.A.na频数分布
frq(TCS2015sample$G1.1.A.na) #缺失值由原本的18个变成为40个
## 
## G1.1.A.你每天利用电脑上网工作、学习的时间有多久? (x) <numeric>
## # total N=100  valid N=60  mean=294.33  sd=188.32
## 
## Value |  N | Raw % | Valid % | Cum. %
## -------------------------------------
##    20 |  1 |  1.00 |    1.67 |   1.67
##    30 |  6 |  6.00 |   10.00 |  11.67
##    60 |  5 |  5.00 |    8.33 |  20.00
##    90 |  1 |  1.00 |    1.67 |  21.67
##   120 |  5 |  5.00 |    8.33 |  30.00
##   180 |  4 |  4.00 |    6.67 |  36.67
##   240 |  4 |  4.00 |    6.67 |  43.33
##   270 |  1 |  1.00 |    1.67 |  45.00
##   300 |  7 |  7.00 |   11.67 |  56.67
##   360 |  5 |  5.00 |    8.33 |  65.00
##   420 |  3 |  3.00 |    5.00 |  70.00
##   480 | 12 | 12.00 |   20.00 |  90.00
##   540 |  2 |  2.00 |    3.33 |  93.33
##   600 |  3 |  3.00 |    5.00 |  98.33
##   720 |  1 |  1.00 |    1.67 | 100.00
##  <NA> | 40 | 40.00 |    <NA> |   <NA>

3.13.2 sjmisc::replace_na()

#将缺失值以某一数值代入sjmisc::replace_na,
#并另存新变量(TCS2015sample$G1.1.A.na2)
TCS2015sample$G1.1.A.na2 <- replace_na(TCS2015sample$G1.1.A.na, value = 294.33) 
#所有的NA都以平均数294.33代入
#呈现新变量G1.1.A.na2频数分布
frq(TCS2015sample$G1.1.A.na2) #已无缺失值(NA)
## 
## G1.1.A.你每天利用电脑上网工作、学习的时间有多久? (x) <numeric>
## # total N=100  valid N=100  mean=294.33  sd=145.38
## 
##  Value |  N | Raw % | Valid % | Cum. %
## --------------------------------------
##  20.00 |  1 |  1.00 |    1.00 |   1.00
##  30.00 |  6 |  6.00 |    6.00 |   7.00
##  60.00 |  5 |  5.00 |    5.00 |  12.00
##  90.00 |  1 |  1.00 |    1.00 |  13.00
## 120.00 |  5 |  5.00 |    5.00 |  18.00
## 180.00 |  4 |  4.00 |    4.00 |  22.00
## 240.00 |  4 |  4.00 |    4.00 |  26.00
## 270.00 |  1 |  1.00 |    1.00 |  27.00
## 294.33 | 40 | 40.00 |   40.00 |  67.00
## 300.00 |  7 |  7.00 |    7.00 |  74.00
## 360.00 |  5 |  5.00 |    5.00 |  79.00
## 420.00 |  3 |  3.00 |    3.00 |  82.00
## 480.00 | 12 | 12.00 |   12.00 |  94.00
## 540.00 |  2 |  2.00 |    2.00 |  96.00
## 600.00 |  3 |  3.00 |    3.00 |  99.00
## 720.00 |  1 |  1.00 |    1.00 | 100.00
##   <NA> |  0 |  0.00 |    <NA> |   <NA>

3.14 分组汇总 dplyr::group_by()

3.14.1 分组汇总+频数分布 dplyr::group_by() + sjmisc::frq()

可以调用“dplyr”套件中的 “group_by”函数+ “sjmisc”套件的“frq”函数, 呈现分组汇总的频数分布。

load("TCS2015small.rda")
#根据性别分层,呈现不同性别对于目前生活满不满意的频数分布
#调用"sjmisc"套件
library(dplyr)
library(sjmisc)
#使用数据(TCS2015small),根据A1变量进行分组(group_by),
#呈现变量(V1.1)的频数分布(frq)
#将结果另存新变量(sex_V1.1_frq)
sex_V1.1_frq <- TCS2015small %>%
  group_by(A1) %>%
  frq(V1.1)
#分组呈现变量的频数分布
sex_V1.1_frq
## 
## V1.1. 整体而言,你对于你的生活满不满意 (V1.1) <numeric>
## # grouped by: 男
## # total N=928  valid N=928  mean=2.71  sd=0.59
## 
## Value |      Label |   N | Raw % | Valid % | Cum. %
## ---------------------------------------------------
##     1 | 非常不满意 |  37 |  3.99 |    3.99 |   3.99
##     2 |     不满意 | 222 | 23.92 |   23.92 |  27.91
##     3 |       满意 | 640 | 68.97 |   68.97 |  96.88
##     4 |   非常满意 |  29 |  3.12 |    3.12 | 100.00
##  <NA> |       <NA> |   0 |  0.00 |    <NA> |   <NA>
## 
## 
## V1.1. 整体而言,你对于你的生活满不满意 (V1.1) <numeric>
## # grouped by: 女
## # total N=1074  valid N=1074  mean=2.84  sd=0.55
## 
## Value |      Label |   N | Raw % | Valid % | Cum. %
## ---------------------------------------------------
##     1 | 非常不满意 |  19 |  1.77 |    1.77 |   1.77
##     2 |     不满意 | 207 | 19.27 |   19.27 |  21.04
##     3 |       满意 | 780 | 72.63 |   72.63 |  93.67
##     4 |   非常满意 |  68 |  6.33 |    6.33 | 100.00
##  <NA> |       <NA> |   0 |  0.00 |    <NA> |   <NA>

3.14.2 分组汇总+平均数 dplyr::group_by() + dplyr::summarise()

可以调用“dplyr”套件中的 “group_by”函数+“dplyr”套件中的“summarise”函数, 呈现分组汇总的平均数。

library(sjmisc)
#G4.2. 请问你大约一周会使用社交媒体几天? 
frq(TCS2015small$G4.2) #valid N=1260
## 
## G4.2. 请问你一周会使用社交媒体几天? (x) <numeric>
## # total N=2002  valid N=1260  mean=6.02  sd=1.94
## 
## Value |   N | Raw % | Valid % | Cum. %
## --------------------------------------
##  0.50 |  23 |  1.15 |    1.83 |   1.83
##  1.00 |  50 |  2.50 |    3.97 |   5.79
##  1.50 |  12 |  0.60 |    0.95 |   6.75
##  2.00 |  56 |  2.80 |    4.44 |  11.19
##  2.50 |   8 |  0.40 |    0.63 |  11.83
##  3.00 |  47 |  2.35 |    3.73 |  15.56
##  3.50 |  11 |  0.55 |    0.87 |  16.43
##  4.00 |  16 |  0.80 |    1.27 |  17.70
##  4.50 |   4 |  0.20 |    0.32 |  18.02
##  5.00 |  46 |  2.30 |    3.65 |  21.67
##  5.50 |   4 |  0.20 |    0.32 |  21.98
##  6.00 |  13 |  0.65 |    1.03 |  23.02
##  6.50 |   5 |  0.25 |    0.40 |  23.41
##  7.00 | 965 | 48.20 |   76.59 | 100.00
##  <NA> | 742 | 37.06 |    <NA> |   <NA>
#使用数据(TCS2015small),根据age_strata变量进行分组(group_by),
#呈现变量(G4.2)的平均数(summarise(mean))
#将结果另存新变量(age_strata_mean )
library(dplyr)
age_strata_mean <- TCS2015small %>%
  group_by(age_strata) %>%
  summarise(meanG4.2 = mean(G4.2, na.rm = TRUE)) #記得要設定na.rm=T
age_strata_mean
## # A tibble: 7 × 2
##   age_strata meanG4.2
##        <dbl>    <dbl>
## 1          1     6.51
## 2          2     6.63
## 3          3     6.04
## 4          4     5.79
## 5          5     5.74
## 6          6     5.61
## 7          7     4.79

4 加权:多变量反覆加权raking(anesrake)

所谓多变量反覆加权(raking),就是将某一个样本变量比例(例如:样本性别比例)和母体比 例(例如:母体性别比例)做一比较对照后,研究者根据母体比例,将样本变量的比例调整 和母体比例一致,调整的方法是给予一个“权数”(母体比例除以样本比例)。

调整完第一个变量之后,接续调整第二个变量比例(例如:年级变量),再透过另外一个 权数,将第二个样本变量的比例调整和母体比例一致。

调整完第二个变量之后,继续调整第三个变量比例(例如:学系变量),再透过另外一个 权数,将第三个样本变量的比例调整和母体比例一致。

如此经过多个变量不断的反覆加权,直到研究者所设定的变量(例如:性别、学系、年级) 经过加权变量的设定后,都呈现出和母体比例一致的面貌。此时,我们就认为该样本能代表 母体,是一个具有“样本代表性”的样本。

具体的分析步骤如以下程式码所示。

  1. 调用“sjlabelled”套件的“read_spss”,将SPSS数据档导入为R数据档
#导入spss数据
library(sjlabelled)
stfood2019 <- read_spss("stfood2019.sav") 
  1. 调用“sjmisc”套件中的“rec”函数,将数据档中想要加权的变量(例如:受访者性别Q1、 就读年级Q2、就读专业Q3),进行重新编码,并给予新的变量名称(Q1->sex, Q2->class, Q3->dep)
#将Q1性别重新编码为为sex变量,并赋予标签(sjmisc::rec),频数分布
library(sjmisc)
stfood2019$sex <- rec(stfood2019$Q1, 
                      rec =  "1=1; 2=2",
                      var.label = "性别",
                      val.labels = c("男", "女"),
                      as.num = T #设置为连续变量
)
frq(stfood2019$sex)
## 
## 性别 (x) <numeric>
## # total N=1058  valid N=1058  mean=1.61  sd=0.49
## 
## Value | Label |   N | Raw % | Valid % | Cum. %
## ----------------------------------------------
##     1 |    男 | 415 | 39.22 |   39.22 |  39.22
##     2 |    女 | 643 | 60.78 |   60.78 | 100.00
##  <NA> |  <NA> |   0 |  0.00 |    <NA> |   <NA>
#将Q2年级重新编码为class变量,并赋予标签(sjmisc::rec),频数分布
library(sjmisc)
stfood2019$class <- rec(stfood2019$Q2, 
                        rec =  "1,2=1; 3,4=2",
                        var.label = "年级",
                        val.labels = c("大一大二", "大三大四"),
                        as.num = T #设置为连续变量
)
frq(stfood2019$class)
## 
## 年级 (x) <numeric>
## # total N=1058  valid N=1058  mean=1.49  sd=0.50
## 
## Value |    Label |   N | Raw % | Valid % | Cum. %
## -------------------------------------------------
##     1 | 大一大二 | 542 | 51.23 |   51.23 |  51.23
##     2 | 大三大四 | 516 | 48.77 |   48.77 | 100.00
##  <NA> |     <NA> |   0 |  0.00 |    <NA> |   <NA>
#将Q3就读专业重新编码为dep变量,并赋予标签(sjmisc::rec),频数分布
library(sjmisc)
stfood2019$dep <- rec(stfood2019$Q3, 
                      rec =  "1,2=1; 3,4=2; 5=3; 6=4",
                      var.label = "学系",
                      val.labels = c("新闻", "传播", "設計", "智媒"),
                      as.num = T #设置为连续变量
)
frq(stfood2019$dep)   
## 
## 学系 (x) <numeric>
## # total N=1058  valid N=1058  mean=1.89  sd=0.82
## 
## Value | Label |   N | Raw % | Valid % | Cum. %
## ----------------------------------------------
##     1 |  新闻 | 389 | 36.77 |   36.77 |  36.77
##     2 |  传播 | 423 | 39.98 |   39.98 |  76.75
##     3 |  設計 | 215 | 20.32 |   20.32 |  97.07
##     4 |  智媒 |  31 |  2.93 |    2.93 | 100.00
##  <NA> |  <NA> |   0 |  0.00 |    <NA> |   <NA>
  1. 调用“sjmisc”套件中的“add_id”函数,将每一个案观察值,赋予一个id编号, id变量的名称为“ID”
#給予觀察值id編號
#调用sjmisc套件
library(sjmisc)
stfood2019<- add_id(stfood2019, var = "ID") 
  1. 运用R base的一些基本函数,创建母体比例变量及变量标签名称
#输入变量的母体比例
#sex=1(男性)的母体比例为0.242, sex=2(女性)的母体比例为0.758
sex <- c(.242, .758)
#class=1(大一大二)的母体比例为0.494, sex=2(大三大四)的母体比例为0.506
class <- c(.494, .506)
#dep=1(新闻系)的母体比例为0.305, dep=2(传媒系)的母体比例为0.391
#dep=3(设计系)的母体比例为0.279, dep=4(智能媒体系)的母体比例为0.025
dep <- c(.305, .391, .279, .025)
#将变量的母体比例存成一个list档,并加以命名(targets)
targets <- list(sex,class,dep)
#在targets档中,将各个变量的母体比例,个别给予变量标签
#母体比例变量的标签名称,要与数据档中样本变量的标签名称,完全相同
names(targets) <- c("sex", "class", "dep")
  1. 调用“anesrake”套件的“anesrake”函数,得到带有“加权变量”(weights)的数据档
#调用anesrake套件
library(anesrake)
## 载入需要的程辑包:Hmisc
## 载入需要的程辑包:lattice
## 载入需要的程辑包:survival
## 载入需要的程辑包:Formula
## 载入需要的程辑包:ggplot2
## 
## 载入程辑包:'ggplot2'
## The following object is masked from 'package:sjlabelled':
## 
##     as_label
## 
## 载入程辑包:'Hmisc'
## The following objects are masked from 'package:dplyr':
## 
##     src, summarize
## The following object is masked from 'package:sjmisc':
## 
##     %nin%
## The following objects are masked from 'package:base':
## 
##     format.pval, units
## 载入需要的程辑包:weights
#调用anesrakec函数,进行多变量反覆加权,将结果另存为新的数据档(outsave)
outsave <- anesrake(targets, stfood2019, caseid=stfood2019$ID)
## [1] "Raking converged in 11 iterations"
   #"targets":母体比例list档档名, "stfood2019"样本数据档档名
   #"caseid":指明样本数据档(stfood2019)观察值编号变量名称(ID),
   #新的加权结果数据档(outsave)包含有两个重要变量("caseid","weightvec")
#将caseid 和weightvec组合成一个data.frame,并另存为新的data frame(caseweights)
caseweights <- data.frame(case_id = outsave$caseid, w_raking = outsave$weightvec)
summary(caseweights)
##     case_id          w_raking     
##  Min.   :   1.0   Min.   :0.4675  
##  1st Qu.: 265.2   1st Qu.:0.5731  
##  Median : 529.5   Median :1.0071  
##  Mean   : 529.5   Mean   :1.0000  
##  3rd Qu.: 793.8   3rd Qu.:1.2343  
##  Max.   :1058.0   Max.   :1.8785
head(caseweights)
##   case_id  w_raking
## 1       1 1.2343464
## 2       2 0.5730626
## 3       3 1.2343464
## 4       4 1.2343464
## 5       5 0.5730626
## 6       6 1.2343464
#将两个data frame(tfood2019,caseweights)进行合并(cbind),就可以得到含有加权变量
#的数据档(stfood2019_merge)
stfood2019_merge<- cbind(stfood2019,caseweights) 
#查看合并后数据档的前六笔观察值
head(stfood2019_merge)
##   ID Q1 Q2 Q3 Q4 Q5 sex class dep case_id  w_raking
## 1  1  2  2  4  3  4   2     1   2       1 1.2343464
## 2  2  1  2  4  3  4   1     1   2       2 0.5730626
## 3  3  2  3  3  4  4   2     2   2       3 1.2343464
## 4  4  2  2  4  2  4   2     1   2       4 1.2343464
## 5  5  1  2  4  4  4   1     1   2       5 0.5730626
## 6  6  2  2  4  5  2   2     1   2       6 1.2343464
#将档案存成R数据档
save(stfood2019_merge, file="stfood2019_merge.rda")
  1. 调用"“sjmisc”套件的“frq”函数及“weights”附属函数,呈现“加权后”的频数分布表
#加权后频数分布表(加权变量:"weights")
library(sjmisc)
frq(stfood2019_merge$sex, weights = stfood2019_merge$w_raking)
## 
## 性别 (xw) <numeric>
## # total N=1058  valid N=1058  mean=1.76  sd=0.43
## 
## Value | Label |   N | Raw % | Valid % | Cum. %
## ----------------------------------------------
##     1 |    男 | 256 | 24.20 |   24.20 |  24.20
##     2 |    女 | 802 | 75.80 |   75.80 | 100.00
##  <NA> |  <NA> |   0 |  0.00 |    <NA> |   <NA>
frq(stfood2019_merge$class, weights = stfood2019_merge$w_raking)
## 
## 年级 (xw) <numeric>
## # total N=1058  valid N=1058  mean=1.50  sd=0.50
## 
## Value |    Label |   N | Raw % | Valid % | Cum. %
## -------------------------------------------------
##     1 | 大一大二 | 524 | 49.53 |   49.53 |  49.53
##     2 | 大三大四 | 534 | 50.47 |   50.47 | 100.00
##  <NA> |     <NA> |   0 |  0.00 |    <NA> |   <NA>
frq(stfood2019_merge$dep, weights = stfood2019_merge$w_raking)
## 
## 学系 (xw) <numeric>
## # total N=1058  valid N=1058  mean=2.02  sd=0.83
## 
## Value | Label |   N | Raw % | Valid % | Cum. %
## ----------------------------------------------
##     1 |  新闻 | 323 | 30.53 |   30.53 |  30.53
##     2 |  传播 | 414 | 39.13 |   39.13 |  69.66
##     3 |  設計 | 295 | 27.88 |   27.88 |  97.54
##     4 |  智媒 |  26 |  2.46 |    2.46 | 100.00
##  <NA> |  <NA> |   0 |  0.00 |    <NA> |   <NA>

5 呈现数据档的编码簿 sjPlot::view_df()及加权后频数分布百分比

调用“sjPlot”套件的“view_df”,可呈现数据档各个变量的编码状况,包括: 变量名称(Name) 变量标签(Label) 缺失值(missings) 变量值(Values) 变量值标签(Value Labels) 频数分布(Freq) 百分比(%) 加权后频数分布(weighted Freq) 加权后百分比(weighted %)

#载入R数据档
load("stfood2019_merge.rda")
#调用"sjPlot"套件
library(sjPlot)
## Install package "strengejacke" from GitHub (`devtools::install_github("strengejacke/strengejacke")`) to load all sj-packages at once!
#呈现数据档的编码簿
view_df(stfood2019_merge, #R数据档名称
        show.na = TRUE,  #呈现缺失值
        show.frq = TRUE, #呈现频数分布
        show.prc = TRUE, #呈现%
        weight.by = w_raking, #根据加权变量(weights)做加权处理
        show.wtd.frq = TRUE, #呈现加权后频数分布
        show.wtd.prc = TRUE, #呈现加权后%
       )
Data frame: stfood2019_merge
ID Name Label missings Values Value Labels Freq. % weighted Freq. weighted %
1 ID 0 (0.00%) range: 1-1058
2 Q1 1.请问您的性别是? 0 (0.00%) 1
2
01.男
02.女
415
643
39.22
60.78
256
802
24.20
75.80
3 Q2
  1. 请问您是大几的学生?
0 (0.00%) 1
2
3
4
大一
大二
大三
大四
243
299
227
289
22.97
28.26
21.46
27.32
204
321
243
291
19.26
30.31
22.95
27.48
4 Q3
  1. 请问您目前就读的专业是什么?
0 (0.00%) 1
2
3
4
5
6
01.新闻学
02.编辑出版学
03.传播学
04.网络与新媒体
05.数字媒体艺术
06.数字媒体技术
166
223
288
135
215
31
15.69
21.08
27.22
12.76
20.32
2.93
135
187
281
132
295
26
12.78
17.71
26.61
12.50
27.94
2.46
5 Q4
  1. 平均来说,请问您一个月吃饭大概花多少钱?
0 (0.00%) 1
2
3
4
5
01.500以下
02.501-1000
03.1001-1500
04.1501-2000
05.2001以上
10
136
387
418
107
0.95
12.85
36.58
39.51
10.11
12
137
395
412
103
1.13
12.94
37.30
38.90
9.73
6 Q5 14.总体来说,对于食堂所提供的餐食服务,您满不满意? 0 (0.00%) 1
2
3
4
5
01.非常不满意
02.不太满意
03.一般‎/普通
04.还算满意
05.非常满意
18
103
411
473
53
1.70
9.74
38.85
44.71
5.01
15
104
416
472
51
1.42
9.83
39.32
44.61
4.82
7 sex 性别 0 (0.00%) 1
2

415
643
39.22
60.78
256
802
24.20
75.80
8 class 年级 0 (0.00%) 1
2
大一大二
大三大四
542
516
51.23
48.77
524
534
49.53
50.47
9 dep 学系 0 (0.00%) 1
2
3
4
新闻
传播
設計
智媒
389
423
215
31
36.77
39.98
20.32
2.93
323
414
295
26
30.53
39.13
27.88
2.46
10 case_id 0 (0.00%) range: 1-1058
11 w_raking 0 (0.00%) range: 0.5-1.9

6 样本代表性检验

调用“stats”套件的“chisq.test”函数,可以检验原始样本的变量比例是否和母体比例一致。 如果p-value <=0.05,我们就说样本在该变量无法代表母体; 如果p-value>0.05,我们就说样本在该变量可以代表母体。

进行原始样本未加权的样本代表性检验。

6.1 original data原始样本代表性检验 stats::chisq.test()

frq(stfood2019$sex)
## 
## 性别 (x) <numeric>
## # total N=1058  valid N=1058  mean=1.61  sd=0.49
## 
## Value | Label |   N | Raw % | Valid % | Cum. %
## ----------------------------------------------
##     1 |    男 | 415 | 39.22 |   39.22 |  39.22
##     2 |    女 | 643 | 60.78 |   60.78 | 100.00
##  <NA> |  <NA> |   0 |  0.00 |    <NA> |   <NA>
#输入样本变量的母体比例,并将样本变量的比例和母体比例做一"样本代表性检验"
#(goodness of fit)。
library(stats)
#母体比例:sex=1(男性)0.242, sex=2(女性)0.758
chisq.test(table(stfood2019_merge$sex),p = c(.242, .758))
## 
##  Chi-squared test for given probabilities
## 
## data:  table(stfood2019_merge$sex)
## X-squared = 130.2, df = 1, p-value < 2.2e-16
   #(p.000<0.05, 样本的性别比例,无法代表母体)

#母体比例:class=1(大一大二)0.495, class=2(大三大四)0.505
chisq.test(table(stfood2019_merge$class),p = c(.495, .505)) 
## 
##  Chi-squared test for given probabilities
## 
## data:  table(stfood2019_merge$class)
## X-squared = 1.2649, df = 1, p-value = 0.2607
    #(p.0.2607>0.05, 样本的年级比例,可以代表母体)

#母体比例:dep=1(新闻系)0.305, dep=2(传媒系)0.391
          #dep=3(设计系)0.279, dep=4(智能媒体系)0.025
chisq.test(table(stfood2019_merge$dep),p =  c(.305, .391, .279, .025))
## 
##  Chi-squared test for given probabilities
## 
## data:  table(stfood2019_merge$dep)
## X-squared = 36.399, df = 3, p-value = 6.166e-08
    #(p.0.000<0.05, 样本的学系比例,无法代表母体)

6.2 weighted data加权后样本代表性检验 sjstats:weighted_chisqtest()

调用“sjstats”套件的“weighted_chisqtest”函数,可以检验加权后样本的变量比例,是否 和母体比例一致。 如果p-value <=0.05,我们就说样本在该变量无法代表母体; 如果p-value >0.05,我们就说样本在该变量可以代表母体。

进行加权后的样本代表性检验

library(sjstats)
#母体比例:sex=1(男性)0.242, sex=2(女性)0.758,加权变量名称"w_raking"
weighted_chisqtest(sex ~w_raking, stfood2019_merge, p=c(.242, .758)) 
## 
## # Weighted chi-squared test for given probabilities
## 
##    Chi-squared: 0.0000
##             df: 1
##        p-value: > .999
##   Observations: 1058
  #(p=0.999>0.005, 样本的性别比例,可以代表母体)

#母体比例:class=1(大一大二)0.495, class=2(大三大四)0.556,加权变量名称"w_raking"
weighted_chisqtest(class ~w_raking, stfood2019_merge, p=c(.495, .505)) 
## 
## # Weighted chi-squared test for given probabilities
## 
##    Chi-squared: 0.0007
##             df: 1
##        p-value: 0.979
##   Observations: 1058
 #(p=0.979>0.005, 样本的年级比例,可以代表母体)

#母体比例:dep=1(新闻系)0.305, dep=2(传媒系)0.391
          #dep=3(设计系)0.279, dep=4(智能媒体系)0.025
          #加权变量名称"w_raking"
weighted_chisqtest(dep ~w_raking, stfood2019_merge, p=c(.305, .391, .279, .025)) 
## 
## # Weighted chi-squared test for given probabilities
## 
##    Chi-squared: 0.0000
##             df: 3
##        p-value: > .999
##   Observations: 1058
 #(p=0.999>0.005, 样本的学系比例,可以代表母体)
#去除 R 当前工作环境中所有的数据与物件
rm(list=ls())

7 本章小结

此处将本章所使用到的R套件与函数摘录如下表,供学习者快速查阅。

套件 函数 说明
base setwd() 设定当前工作目录
getwd() 显示当前工作目录
install.packages() 下载套件
library() 调用套件
save() 将档案存成R数据资料档格式(*.rda)
load() 载入R数据资料档(*.rda)
head() 呈现数据档前六笔个案观察值
table() 呈现变量的频数分布
summarise() 呈现摘要统计量
c() 将括弧内的元素组合成一个向量集合
cbind() 以增加新变量的方式,合并两个数据档
rm(list=ls()) 去除R当前工作环境中所有的数据与物件
stats chisq.test() 样本代表性检验(卡方适合度检验)
dplyr select() 挑选特定变量
mutate() 创建新变量
bind_cols() 以增加新变量的方式,合并两个数据档
%>% 管线运算
arrange(,desc()) 将特定变量依其数值由大到小排序
min_rank(desc()) 变量的最大数值,排名最前
min_rank() 变量的最大数值,排名最后
percent_rank(desc()) 变量的最大数值,给予最小百分位排名
percent_rank() 变量的最大数值,给予最大百分位排名
group_by() 根据某个特定变量,进行分组
sjlabelled read_spss() 将SPSS格式数据资料档(*.sav)汇入到R
sjmisc frq() 呈现变量的频数分布
frq(,weights) 呈现变量的频数分布(加权后)
move_columns(,.before) 将变量移动到某一个变量之前
move_columns(,.after) 将变量移动到某一个变量之后
rename_variables() 重新命名变量的名称
find_var() 寻找“变量名称”(var.name)或“变量标签”
(var.label)中包含某个“特定名称”的变量
remove_var() 删除特定变量
rec() 将原始变量重新编码为另一新的变量
flat_table() 呈现好几个变量的巢套频数分布
dicho() 将某一特定连续变量,转换为二分类变量
add_variables(,.before) 创建新变量并放置在某个变量之前
add_variables(,.after) 创建新变量并放置在某个变量之后
add_id() 创建观察值的id变量
to_dummy() 根据某一类别变量的“类别数目”,创建出
相对应的“虚拟变量数目”
row_count() 计算特定观察值在不同变量出现的次数
set_na() 将特定数值设置为缺失值
replace_na() 将缺失值以某一数值代入
sjPlot view_df() 呈现数据档的编码簿
sjstats weighted_chisqtest() 加权后样本代表性检验(加权后卡方适合度检验)
anesrake anesrake() 进行多变量反覆加权