R讲义:数据档变量的编辑管理

Author
Affiliation

刘念夏教授, PhD

Published

16 October 2025

1 分析前的环境设置

1.1 下载安装套件包

本章学习者須先下载安装相關套件包,方能正常運行。

#下载安装套件包
#如果之前有下载过,会跳过不下载;如果之前没有下载过,会下载安装套件包
if (!require("showtext")) install.packages("showtext")
if (!require("dplyr")) install.packages("dplyr")
if (!require("sjlabelled")) install.packages("sjlabelled")
if (!require("sjmisc")) install.packages("sjmisc")

1.2 环境设置

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

#设置工作目录(此处要改成你自己的工作目录)
setwd("/Users/simonfair/Desktop/量化研究数据分析/R Ch4 数据档变量的编辑管理")

getwd() #查看目前的工作目录
[1] "/Users/simonfair/Desktop/量化研究数据分析/R Ch4 数据档变量的编辑管理"
#设置系統中文文字编码(简体中文)
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) 
showtext_auto(enable = TRUE)

2 读取SPSS数据档 sjlabelled::read_spss( )

使用 “sjlabelled”套件包的 read_spss( )函数, 将SPSS数据档(TCS2015small.sav)汇入到R。 使用 head( )函数,看一下汇进来数据档中的前6笔数据。 使用 save( )函数,將汇进来的数据档存成R格式数据档(*.rda)。 使用 load( )函数,將R格式数据档叫进记忆体。

#加载"sjlabelled" 套件
library(sjlabelled)

#将SPSS数据汇入到R(数据档要放在目前的工作目录下)
TCS2015small <- read_spss("TCS2015small.sav")
Converting atomic to factors. Please wait...
#看一下数据档中的前6笔数据
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 查看变量的属性特征及变量(值)标签 attributes( )

使用 attributes( )函数,可以呈现类别变量的 “levels”(水平)、“class”(类别)、“labels”(变量值标签)、以及”label”(变量标签)。对于数字变量来说,则可以呈现”label”(变量标签)。

#类别变量
attributes(TCS2015small$V1.1) #呈现变量的levels, class, labels, label
$levels
[1] "1" "2" "3" "4"

$class
[1] "factor"

$labels
非常不满意     不满意       满意   非常满意 
         1          2          3          4 

$label
[1] "V1.1. 整体而言,你对于你的生活满不满意"
#数字变量
attributes(TCS2015small$A2.age)#呈现变量的label
$label
[1] "年龄"

$format.spss
[1] "F17.0"

$display_width
[1] 19

4 转换变量的属性 sjlabelled::to_numeric( ); sjlabelled::to_factor()

使用 sjlabelled套件包的 to_numeric( )函数, 可以将一个”类别变量” (factor)转换为 “数字变量”(numeric); 使用 sjlabelled套件包 的 to_factor( )函数, 可以将一个”数字变量” (numeric)转换为 “类别变量”(factor)。

#查看变量属性
class(TCS2015small$V1.1)  #是个 "factor"(类别变量)
[1] "factor"
#加载"sjlabelled"套件包
library(sjlabelled)

#将factor->numeric
TCS2015small$V1.1 <- to_numeric(TCS2015small$V1.1)

#查看变量属性
class(TCS2015small$V1.1) #转换成"numeric"(数字变量)
[1] "numeric"
#将numeric->factor
TCS2015small$V1.1 <- to_factor(TCS2015small$V1.1)

#查看变量属性
class(TCS2015small$V1.1) #转换成"factoer"(类别变量)
[1] "factor"

也可使用R基本函数的 as.factor( )as.numeric( ) 函数, 进行变量属性的转换。

5 赋予变量标签及变量值标签

5.1 方法一:levels( ) (只设定变量值标签)

对于数据档的分析变量(例如:TCS2015small$A1),可以使用 levels( ) 函数,将每个变量值,都赋予名称(例如:A1=1:“男性”, A1=2:“女性” )。

#把R数据档叫进来
load("TCS2015small.rda")

#呈现分析变量的变量值与频数
table(TCS2015small$A1) # 1 928, 2 1074

   1    2 
 928 1074 
#赋予分析变量每个变量值标签
levels(TCS2015small$A1) <- c("男性","女性") #1:"男性" 2:"女性"

#呈现分析变量的变量值与频数
table(TCS2015small$A1) #  男性 928, 女性 1074

男性 女性 
 928 1074 

5.2 方法二:sjlabelled::set_label( ); set_labels( ) (设置变量标签与变量值标签)

另外一个方法,是使用 sjlabelled套件包的set_label( )set_labels( )函数,可以同时设置分析变量的变量标签与变量值标签。

#把R数据档叫进来
load("TCS2015small.rda")

#加载"sjlabelled"套件包
library(sjlabelled)

#设置变量标签
TCS2015small$A1.3 <- set_label(TCS2015small$A1, "性别") 

#设置变量值标签
TCS2015small$A1.3 <- set_labels(TCS2015small$A1,
                    labels = c("male男性", "female女性"))

#加载"sjmisc"套件包
library(sjmisc)

#呈现频数分布
frq(TCS2015small$A1.3)
性别 (x) <categorical> 
# total N=2002 valid N=2002 mean=1.54 sd=0.50

Value |      Label |    N | Raw % | Valid % | Cum. %
----------------------------------------------------
    1 |   male男性 |  928 | 46.35 |   46.35 |  46.35
    2 | female女性 | 1074 | 53.65 |   53.65 | 100.00
 <NA> |       <NA> |    0 |  0.00 |    <NA> |   <NA>

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

使用 sjmisc套件包的rename_variables( )函数, 可以更改变量的名称。

#把R数据档叫进来
load("TCS2015small.rda")

#加载"sjmisc"套件包
library(sjmisc)

head(TCS2015small) #呈现前面6个观察值,所有变量
          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
#将数据档(TCS2015small)的A1变量,重新命名(rename_variables)为"sex",
#并另存新档(TCS2015small.rename)
TCS2015small.rename <- rename_variables(TCS2015small, A1 = "sex")

#呈现数据档(TCS2015small.rename)前面6个观察值,所有变量
head(TCS2015small.rename) #变量"A1"已改名为"sex"
          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

7 查找变量 sjmisc::find_var( )

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

#把R数据档叫进来
load("TCS2015small.rda")

#加载"sjmisc"套件
library(sjmisc)

#寻找变量名称(var.name) 或 变量标签(var.label)包含"age"的变量
find_var(TCS2015small, "age", search = "all") 
  col.nr   var.name var.label
1      4     A2.age      年龄
2      5 age_strata  年龄分层
#寻找变量名称(var.name) 或 变量标签(var.label)包含"年龄"的变量
find_var(TCS2015small, "年龄", search = "all")
  col.nr   var.name var.label
1      4     A2.age      年龄
2      5 age_strata  年龄分层
#寻找变量名称(var.name) 或 变量标签(var.label)包含"G"的变量
find_var(TCS2015small, "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(TCS2015small, "社交媒体", 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(TCS2015small, "满意", search = "all", out = "df")

#频数分布
frq(mydf)
V1.1. 整体而言,你对于你的生活满不满意 (V1.1) <categorical> 
# total N=2002 valid N=2002 mean=2.78 sd=0.57

Value |      Label |    N | Raw % | Valid % | Cum. %
----------------------------------------------------
    1 | 非常不满意 |   56 |  2.80 |    2.80 |   2.80
    2 |     不满意 |  429 | 21.43 |   21.43 |  24.23
    3 |       满意 | 1420 | 70.93 |   70.93 |  95.15
    4 |   非常满意 |   97 |  4.85 |    4.85 | 100.00
 <NA> |       <NA> |    0 |  0.00 |    <NA> |   <NA>

8 删除变量 sjmisc::remove_var( )

使用 sjmisc 套件包的 remove_var( )函数,可以删除特定变量。

#把R数据档叫进来
load("TCS2015small.rda")

#呈现数据档(TCS2015small)前面6个观察值,所有变量
head(TCS2015small) #共有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)

#删除TCS2015small资料档中的"age_strata"变量,并另存新档(TCS2015small_remvar) 
TCS2015small.remvar <- remove_var(TCS2015small, "age_strata")

#呈现数据档(TCS2015small.remvar)前面6个观察值,所有变量
head(TCS2015small.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

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

可以使用 dplyr 套件包的 select( ) 函数, 搭配 start_with( ), ends_with( ), 以及 contains( )三个参数,挑选符合特定条件的变量。

#把R数据档叫进来
load("TCS2015small.rda")

#加载"dplyr"套件
library(dplyr)

#将TCS2015small数据档中的A1与age_strata两个变量,单独挑选出来(select) 并呈现前6笔数据
head(select(TCS2015small, 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(TCS2015small,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(TCS2015small,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(TCS2015small, 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

10 移动变量的位置sjmisc::move_columns( )

可以使用 sjmisc* 套件包的 move_columns( )** 函数,搭配 .before参数, 将变量在数据档的位置,移动到某个变量之前。

10.1 sjmisc::move_columns(,.before)

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

#把R数据档叫进来
load("TCS2015small.rda")

#加载"sjmisc"套件包
library(sjmisc)

#将数据档(TCS2015small)的V1.1变量,移动(move_columns)到G1.1.A变量之前并另存新档(TCS2015small.move )
TCS2015small.move <- move_columns(TCS2015small, V1.1, 
                                  .before = "G1.1.A") 

#呈现数据档*TCS2015small.move)前面6个观察值,所有变量
head(TCS2015small.move) #V1.1变量已在G1.1.A变量之前
          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

10.2 sjmisc::move_columns(,.after)

可以使用 sjmisc 套件包的 move_columns( ) 函数,搭配 .after参数, 将变量在数据档的位置,移动到某个变量之后。

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

#把R数据档叫进来
load("TCS2015small.rda")

#加载"sjmisc"套件包
library(sjmisc)

#将数据档(TCS2015small)的V1.1变量,移动(move_columns)到G1.1.A变量之后,并另存新档(TCS2015small.move)
TCS2015small.move <- move_columns(TCS2015small, V1.1,
                                   .after = "G1.1.A") 

#呈现数据档*TCS2015small.move)前面6个观察值,所有变量
head(TCS2015small.move) #V1.1变量已在G1.1.A变量之后
          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

11 将变量值重新编码(重要:常用)

11.1 重新编码 sjmisc::rec( )与检查编码的正确性 sjmisc::flat_table( )

可以使用 sjmisc 套件包的 rec( )函数, 将原始变量重新编码为另一新的变量。 并可搭配参数 var.label= ” “ 赋予变量标签; 参数 val.labels= ” “ 赋予变量值标签。

#把R数据档叫进来
load("TCS2015small.rda")

#加载"sjmisc"套件
library(sjmisc)

#频数分布(sjmisc::frq)
frq(TCS2015small$A2.age)
年龄 (x) <numeric> 
# total N=2002 valid N=2002 mean=47.35 sd=15.99

Value |  N | Raw % | Valid % | Cum. %
-------------------------------------
   18 | 14 |  0.70 |    0.70 |   0.70
   19 | 24 |  1.20 |    1.20 |   1.90
   20 | 22 |  1.10 |    1.10 |   3.00
   21 | 24 |  1.20 |    1.20 |   4.20
   22 | 21 |  1.05 |    1.05 |   5.24
   23 | 26 |  1.30 |    1.30 |   6.54
   24 | 28 |  1.40 |    1.40 |   7.94
   25 | 24 |  1.20 |    1.20 |   9.14
   26 | 29 |  1.45 |    1.45 |  10.59
   27 | 25 |  1.25 |    1.25 |  11.84
   28 | 23 |  1.15 |    1.15 |  12.99
   29 | 20 |  1.00 |    1.00 |  13.99
   30 | 28 |  1.40 |    1.40 |  15.38
   31 | 36 |  1.80 |    1.80 |  17.18
   32 | 45 |  2.25 |    2.25 |  19.43
   33 | 36 |  1.80 |    1.80 |  21.23
   34 | 54 |  2.70 |    2.70 |  23.93
   35 | 42 |  2.10 |    2.10 |  26.02
   36 | 50 |  2.50 |    2.50 |  28.52
   37 | 58 |  2.90 |    2.90 |  31.42
   38 | 57 |  2.85 |    2.85 |  34.27
   39 | 54 |  2.70 |    2.70 |  36.96
   40 | 36 |  1.80 |    1.80 |  38.76
   41 | 41 |  2.05 |    2.05 |  40.81
   42 | 30 |  1.50 |    1.50 |  42.31
   43 | 40 |  2.00 |    2.00 |  44.31
   44 | 32 |  1.60 |    1.60 |  45.90
   45 | 38 |  1.90 |    1.90 |  47.80
   46 | 29 |  1.45 |    1.45 |  49.25
   47 | 38 |  1.90 |    1.90 |  51.15
   48 | 35 |  1.75 |    1.75 |  52.90
   49 | 44 |  2.20 |    2.20 |  55.09
   50 | 38 |  1.90 |    1.90 |  56.99
   51 | 42 |  2.10 |    2.10 |  59.09
   52 | 33 |  1.65 |    1.65 |  60.74
   53 | 48 |  2.40 |    2.40 |  63.14
   54 | 43 |  2.15 |    2.15 |  65.28
   55 | 37 |  1.85 |    1.85 |  67.13
   56 | 36 |  1.80 |    1.80 |  68.93
   57 | 54 |  2.70 |    2.70 |  71.63
   58 | 52 |  2.60 |    2.60 |  74.23
   59 | 40 |  2.00 |    2.00 |  76.22
   60 | 32 |  1.60 |    1.60 |  77.82
   61 | 52 |  2.60 |    2.60 |  80.42
   62 | 37 |  1.85 |    1.85 |  82.27
   63 | 34 |  1.70 |    1.70 |  83.97
   64 | 34 |  1.70 |    1.70 |  85.66
   65 | 27 |  1.35 |    1.35 |  87.01
   66 | 26 |  1.30 |    1.30 |  88.31
   67 | 20 |  1.00 |    1.00 |  89.31
   68 | 22 |  1.10 |    1.10 |  90.41
   69 | 10 |  0.50 |    0.50 |  90.91
   70 | 11 |  0.55 |    0.55 |  91.46
   71 | 12 |  0.60 |    0.60 |  92.06
   72 | 17 |  0.85 |    0.85 |  92.91
   73 | 15 |  0.75 |    0.75 |  93.66
   74 | 21 |  1.05 |    1.05 |  94.71
   75 |  9 |  0.45 |    0.45 |  95.15
   76 | 11 |  0.55 |    0.55 |  95.70
   77 | 13 |  0.65 |    0.65 |  96.35
   78 | 10 |  0.50 |    0.50 |  96.85
   79 |  9 |  0.45 |    0.45 |  97.30
   80 | 11 |  0.55 |    0.55 |  97.85
   81 |  6 |  0.30 |    0.30 |  98.15
   82 |  7 |  0.35 |    0.35 |  98.50
   83 |  6 |  0.30 |    0.30 |  98.80
   84 |  1 |  0.05 |    0.05 |  98.85
   85 |  7 |  0.35 |    0.35 |  99.20
   86 |  6 |  0.30 |    0.30 |  99.50
   88 |  2 |  0.10 |    0.10 |  99.60
   89 |  2 |  0.10 |    0.10 |  99.70
   90 |  2 |  0.10 |    0.10 |  99.80
   91 |  1 |  0.05 |    0.05 |  99.85
   92 |  1 |  0.05 |    0.05 |  99.90
   93 |  1 |  0.05 |    0.05 |  99.95
   96 |  1 |  0.05 |    0.05 | 100.00
 <NA> |  0 |  0.00 |    <NA> |   <NA>
#重新编码(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)
TCS2015small$A2.age.cat5 <- rec(TCS2015small$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(TCS2015small$A2.age.cat5)
年龄五分类 (x) <categorical> 
# total N=2002 valid N=2002 mean=3.18 sd=1.39

Value |      Label |   N | Raw % | Valid % | Cum. %
---------------------------------------------------
    1 |    18-29岁 | 280 | 13.99 |   13.99 |  13.99
    2 |    30-39岁 | 460 | 22.98 |   22.98 |  36.96
    3 |    40-49岁 | 363 | 18.13 |   18.13 |  55.09
    4 |    50-59岁 | 423 | 21.13 |   21.13 |  76.22
    5 | 60岁及以上 | 476 | 23.78 |   23.78 | 100.00
 <NA> |       <NA> |   0 |  0.00 |    <NA> |   <NA>

可以使用 sjmisc 套件包的 flat_table( ) 函数, 检查重新编码的正确性。

#检查重新编码的正确性:sjmisc::flat_table
library(sjmisc)
flat_table(TCS2015small,A2.age, A2.age.cat5)
       A2.age.cat5 18-29岁 30-39岁 40-49岁 50-59岁 60岁及以上
A2.age                                                       
18                      14       0       0       0          0
19                      24       0       0       0          0
20                      22       0       0       0          0
21                      24       0       0       0          0
22                      21       0       0       0          0
23                      26       0       0       0          0
24                      28       0       0       0          0
25                      24       0       0       0          0
26                      29       0       0       0          0
27                      25       0       0       0          0
28                      23       0       0       0          0
29                      20       0       0       0          0
30                       0      28       0       0          0
31                       0      36       0       0          0
32                       0      45       0       0          0
33                       0      36       0       0          0
34                       0      54       0       0          0
35                       0      42       0       0          0
36                       0      50       0       0          0
37                       0      58       0       0          0
38                       0      57       0       0          0
39                       0      54       0       0          0
40                       0       0      36       0          0
41                       0       0      41       0          0
42                       0       0      30       0          0
43                       0       0      40       0          0
44                       0       0      32       0          0
45                       0       0      38       0          0
46                       0       0      29       0          0
47                       0       0      38       0          0
48                       0       0      35       0          0
49                       0       0      44       0          0
50                       0       0       0      38          0
51                       0       0       0      42          0
52                       0       0       0      33          0
53                       0       0       0      48          0
54                       0       0       0      43          0
55                       0       0       0      37          0
56                       0       0       0      36          0
57                       0       0       0      54          0
58                       0       0       0      52          0
59                       0       0       0      40          0
60                       0       0       0       0         32
61                       0       0       0       0         52
62                       0       0       0       0         37
63                       0       0       0       0         34
64                       0       0       0       0         34
65                       0       0       0       0         27
66                       0       0       0       0         26
67                       0       0       0       0         20
68                       0       0       0       0         22
69                       0       0       0       0         10
70                       0       0       0       0         11
71                       0       0       0       0         12
72                       0       0       0       0         17
73                       0       0       0       0         15
74                       0       0       0       0         21
75                       0       0       0       0          9
76                       0       0       0       0         11
77                       0       0       0       0         13
78                       0       0       0       0         10
79                       0       0       0       0          9
80                       0       0       0       0         11
81                       0       0       0       0          6
82                       0       0       0       0          7
83                       0       0       0       0          6
84                       0       0       0       0          1
85                       0       0       0       0          7
86                       0       0       0       0          6
88                       0       0       0       0          2
89                       0       0       0       0          2
90                       0       0       0       0          2
91                       0       0       0       0          1
92                       0       0       0       0          1
93                       0       0       0       0          1
96                       0       0       0       0          1
  #A2.age(18...29岁)的观察值,都落在A2.age.cat5(18-29岁)的范畴内
  #A2.age(30...39岁)的观察值,都落在A2.age.cat5(30-39岁)岁的范畴内
  #A2.age(40...49岁)的观察值,都落在A2.age.cat5(40-49岁)岁的范畴内
  #A2.age(50...59岁)的观察值,都落在A2.age.cat5(50-59岁)岁的范畴内
  #A2.age(60...96岁)的观察值,都落在A2.age.cat5(60岁以上)岁的范畴内

11.2 将连续变量分割成数目约略相等的组别 sjmisc::split_var( )

可以使用 sjmisc 套件包的 split_var( )函数, 将一个”连续变量” (例如:TCS2015small\(A2.age), 分割成数目约略相等的组别(例如:5组),并另存为一个新的变量(例如:TCS2015small\)A2.age.group5)。

#把R数据档叫进来
load("TCS2015small.rda")

#加载 "sjmisc"套件包
library(sjmisc)

#将A2.age变量,分割成5组,并另存为A2.age.group5
TCS2015small$A2.age.group5 <- split_var(TCS2015small$A2.age, n = 5)

#分为5组后的频数分布
frq(TCS2015small$A2.age.group5 )
年龄 (x) <categorical> 
# total N=2002 valid N=2002 mean=3.05 sd=1.43

Value |   N | Raw % | Valid % | Cum. %
--------------------------------------
    1 | 389 | 19.43 |   19.43 |  19.43
    2 | 387 | 19.33 |   19.33 |  38.76
    3 | 407 | 20.33 |   20.33 |  59.09
    4 | 375 | 18.73 |   18.73 |  77.82
    5 | 444 | 22.18 |   22.18 | 100.00
 <NA> |   0 |  0.00 |    <NA> |   <NA>

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

可以使用 sjmisc 套件包的 dicho( )函数, 将一个”连续变量” (例如:TCS2015small\(A2.age), 依据某个切点(例如:39岁),进行二分编码(例如:18-39岁与40岁及以上),并另存为一个新的变量(例如:TCS2015small\)A2.age.dicho)。

#把R数据档叫进来
load("TCS2015small.rda")

#加载 "sjmisc"套件包
library(sjmisc)

#将TCS2015small$A2.age变量,根据A2.age=40分为两组
#一组为18-39岁,另一组为40岁及以上
#分别设置变量标签(var.label),与变量值标签(val.labels)
#将二分编码后的变量,重新设置为新的变量名称(A2.age.dicho)
TCS2015small$A2.age.dicho <- dicho(TCS2015small$A2.age, 
                           dich.by = 39,
                           var.label = "年龄二分类", 
                           val.labels = c("18-39岁", "40岁及以上"),
             append = FALSE)

#二分编码后的频数分布
frq(TCS2015small$A2.age.dicho )
年龄二分类 (x) <categorical> 
# total N=2002 valid N=2002 mean=0.63 sd=0.48

Value |      Label |    N | Raw % | Valid % | Cum. %
----------------------------------------------------
    0 |    18-39岁 |  740 | 36.96 |   36.96 |  36.96
    1 | 40岁及以上 | 1262 | 63.04 |   63.04 | 100.00
 <NA> |       <NA> |    0 |  0.00 |    <NA> |   <NA>

12 创建新变量 dplyr::mutate();sjmisc::add_variables()(重要:常用)

12.1 方法一 dplyr::mutate( )

可以使用 dplyr套件包的 mutate( )函数, 依据特定运算规则,创建新变量。

#把R数据档叫进来
load("TCS2015small.rda")

#加载"dplyr"套件
library(dplyr)

#新增一个变量(smuse2_min_day)其值为根据某种特定运算规则而得(G4.3.1*60 + G4.3.2),并将新建变量(smuse2_min_day)另存到新的数据档(TCS2015sample.mutate)
TCS2015small.mutate <- mutate(TCS2015small, smuse2_min_day = G4.3.1*60 + G4.3.2)

#呈现数据档(TCS2015small.mutate)前面6个观察值,所有变量
head(TCS2015small.mutate)
          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
  smuse2_min_day
1             60
2              5
3            120
4             30
5             10
6             30
#新增的变量(smuse2_min_day)会呈现在整个数据档的最后面

12.2 方法二 sjmisc::add_variables( )

也可以使用 sjmisc 套件包的 add_variables( )函数, 依据特定运算规则,创建新变量。

#把R数据档叫进来
load("TCS2015small.rda")

#加载simisc套件
library(sjmisc) 

#在TCS2015small资料档,增加一个新变量名称为"new_var",数值为"3",
#新变量的位置放在 "V1.1"变量之后,并另存新数据档(TCS2015small.add.a)
TCS2015small.add.a<- add_variables(TCS2015small, new_var1 = 3, .after = "V1.1")

#呈现前面6个观察值,所有变量
head(TCS2015small.add.a) 
          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
1        3
2        3
3        3
4        3
5        3
6        3
#新变量的位置放在 "V1.1"变量之前,另存原数据档(TCS2015sample.add.b)
TCS2015small.add.b <- add_variables(TCS2015small, new_var2 = 4, .before = "V1.1")

#呈现数据档(TCS2015small)前面6个观察值,所有变量
head(TCS2015small.add.b)
          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
1    3
2    3
3    2
4    3
5    3
6    2

13 增加id变量 sjmisc::add_id( )(常用:重要)

可以使用 sjmisc 套件包的 add_id( )函数, 创建观察值的id变量。

#把R数据档叫进来
load("TCS2015small.rda")

#使用sjmisc套件的"add_id"函数,并将观察值id变量的名称,设置为"ID_user" 
#id变量默认放在第一个column,并回存原始数据档
TCS2015small<- add_id(TCS2015small, var = "ID_user") 

#呈现数据档(TCS2015small)前面6个观察值,前面10个变量
head(TCS2015small[,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

14 制造虚拟变量 sjmisc::to_dummy( )(常用:重要)

可以使用 sjmisc套件包的 to_dummy( ) 函数, 根据某一类别变量的”类别数目”,创建出相对应的”虚拟变量数目”。 这点在做类别变量回归分析时,特别有用。

#载入R数据档
load("TCS2015small.rda")

#加载simisc套件
library(sjmisc)

#做频数分布,查看有几类
frq(TCS2015small$V1.1)#有4类
V1.1. 整体而言,你对于你的生活满不满意 (x) <categorical> 
# total N=2002 valid N=2002 mean=2.78 sd=0.57

Value |      Label |    N | Raw % | Valid % | Cum. %
----------------------------------------------------
    1 | 非常不满意 |   56 |  2.80 |    2.80 |   2.80
    2 |     不满意 |  429 | 21.43 |   21.43 |  24.23
    3 |       满意 | 1420 | 70.93 |   70.93 |  95.15
    4 |   非常满意 |   97 |  4.85 |    4.85 | 100.00
 <NA> |       <NA> |    0 |  0.00 |    <NA> |   <NA>
#将类别变量(V1.1),创建相对应的虚拟变量(to_dummy)
#虚拟变量的名称会以"dummy_1", "dummy_2", "dummy_3", "dummy_4"...为开头。
#并将所产生的虚拟变量,另存新档(TCS2015small.dummy)
TCS2015small.dummy <- to_dummy(TCS2015small$V1.1, var.name = "dummy")
head(TCS2015small.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
#加载sjmisc套件
library(sjmisc)

#将原始数据档(TCS2015small)与虚拟变量数据档(TCS2015small.dummy)进行变量合并(replace_columns),另存为一个新的数据档(例如:mydf2_rep_col)
mydf2_rep_col <- replace_columns(TCS2015small, TCS2015small.dummy)

#呈现合并数据档前面6个观察值,全部变量
head(mydf2_rep_col) 
          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

15 将变量值 标准化中心化 sjmisc::std( );center( )

有时为了处理数据的需要,我们必须将数据予以 标准化Z值标准化是常用的一种方式(将原始数据减去其平均数,再除以其标准差,使其转换为均值为0,标准差为1的分布)。要进行 Z值标准,可使用 sjmisc套件包的 std( )函数,进行标准化的转换。

另外,有时也必须将数据中心化(将原始数据减去其平均数,使得新的数据的平均值为0),此时可使用 sjmisc 套件包的 center( ) 函数,进行中心化的转换。

#把R数据档叫进来
load("TCS2015small.rda")

#加载 "sjmisc"套件包
library(sjmisc)

#将原始数据(TCS2015small$A2.age)标准化,并另存新档(TCS2015small$A2.age.z)
TCS2015small$A2.age.z <- std(TCS2015small$A2.age) 

#查看前6个观察值(标准化数据变量)
head(TCS2015small$A2.age.z)
[1] -0.58443868 -0.02164588 -1.27229655  0.60367946  0.60367946 -1.27229655
#将原始数据(TCS2015small$A2.age)中心化,并另存新档(TCS2015small$A2.age.c)
TCS2015small$A2.age.c <- center(TCS2015small$A2.age) 

#查看前6个观察值(中心化数据变量)
head(TCS2015small$A2.age.c)
[1]  -9.3461538  -0.3461538 -20.3461538   9.6538462   9.6538462 -20.3461538
#比较:原始数据、标准化数据、中心化数据
#制作一个包含原始数据、Z值标准化数据以及中心化数据的数据框
df.zc <- data.frame(TCS2015small$A2.age, TCS2015small$A2.age.z,  TCS2015small$A2.age.c)

#查看前6个观察值(作为比较之用)
head(df.zc)
  TCS2015small.A2.age TCS2015small.A2.age.z TCS2015small.A2.age.c
1                  38           -0.58443868            -9.3461538
2                  47           -0.02164588            -0.3461538
3                  27           -1.27229655           -20.3461538
4                  57            0.60367946             9.6538462
5                  57            0.60367946             9.6538462
6                  27           -1.27229655           -20.3461538

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

可以使用 sjmisc套件包的 set_na( )函数,将特定数值设置为缺失值; 也可使用 sjmisc套件包的 replace_na( )函数,将缺失值以某一数值代入。

#载入R数据档
load("TCS2015small.rda")

#加载"sjmisc"套件
library(sjmisc)

#频数分布
frq(TCS2015small$G1.1.A) #缺失值(NA)有559个,数值代码"0"有593个
G1.1.A.你每天利用电脑上网工作、学习的时间有多久? (x) <numeric> 
# total N=2002 valid N=1443 mean=146.76 sd=184.35

Value |   N | Raw % | Valid % | Cum. %
--------------------------------------
    0 | 593 | 29.62 |   41.09 |  41.09
   10 |   7 |  0.35 |    0.49 |  41.58
   15 |   2 |  0.10 |    0.14 |  41.72
   20 |   8 |  0.40 |    0.55 |  42.27
   23 |   1 |  0.05 |    0.07 |  42.34
   25 |   1 |  0.05 |    0.07 |  42.41
   27 |   1 |  0.05 |    0.07 |  42.48
   30 |  49 |  2.45 |    3.40 |  45.88
   35 |   1 |  0.05 |    0.07 |  45.95
   45 |   2 |  0.10 |    0.14 |  46.08
   50 |   1 |  0.05 |    0.07 |  46.15
   60 | 126 |  6.29 |    8.73 |  54.89
   62 |   1 |  0.05 |    0.07 |  54.95
   90 |  16 |  0.80 |    1.11 |  56.06
  120 | 122 |  6.09 |    8.45 |  64.52
  150 |   7 |  0.35 |    0.49 |  65.00
  180 |  63 |  3.15 |    4.37 |  69.37
  210 |   7 |  0.35 |    0.49 |  69.85
  240 | 101 |  5.04 |    7.00 |  76.85
  270 |   3 |  0.15 |    0.21 |  77.06
  300 |  64 |  3.20 |    4.44 |  81.50
  330 |   3 |  0.15 |    0.21 |  81.70
  360 |  47 |  2.35 |    3.26 |  84.96
  390 |   3 |  0.15 |    0.21 |  85.17
  420 |  22 |  1.10 |    1.52 |  86.69
  450 |   2 |  0.10 |    0.14 |  86.83
  480 | 127 |  6.34 |    8.80 |  95.63
  540 |  26 |  1.30 |    1.80 |  97.44
  600 |  24 |  1.20 |    1.66 |  99.10
  720 |  13 |  0.65 |    0.90 | 100.00
 <NA> | 559 | 27.92 |    <NA> |   <NA>

16.1 设定缺失值 sjmisc::set_na( )

#将TCS2015small数据档G1.1.A变量的数值代码"0",设置为缺失值(set_na),
#并另存为新的变量名称G1.1.A.na
TCS2015small$G1.1.A.na <- set_na(TCS2015small$G1.1.A, na = "0")

#呈现新变量G1.1.A.na频数分布
frq(TCS2015small$G1.1.A.na) #缺失值成为1152个(559+593=1152)
G1.1.A.你每天利用电脑上网工作、学习的时间有多久? (x) <numeric> 
# total N=2002 valid N=850 mean=249.14 sd=179.40

Value |    N | Raw % | Valid % | Cum. %
---------------------------------------
   10 |    7 |  0.35 |    0.82 |   0.82
   15 |    2 |  0.10 |    0.24 |   1.06
   20 |    8 |  0.40 |    0.94 |   2.00
   23 |    1 |  0.05 |    0.12 |   2.12
   25 |    1 |  0.05 |    0.12 |   2.24
   27 |    1 |  0.05 |    0.12 |   2.35
   30 |   49 |  2.45 |    5.76 |   8.12
   35 |    1 |  0.05 |    0.12 |   8.24
   45 |    2 |  0.10 |    0.24 |   8.47
   50 |    1 |  0.05 |    0.12 |   8.59
   60 |  126 |  6.29 |   14.82 |  23.41
   62 |    1 |  0.05 |    0.12 |  23.53
   90 |   16 |  0.80 |    1.88 |  25.41
  120 |  122 |  6.09 |   14.35 |  39.76
  150 |    7 |  0.35 |    0.82 |  40.59
  180 |   63 |  3.15 |    7.41 |  48.00
  210 |    7 |  0.35 |    0.82 |  48.82
  240 |  101 |  5.04 |   11.88 |  60.71
  270 |    3 |  0.15 |    0.35 |  61.06
  300 |   64 |  3.20 |    7.53 |  68.59
  330 |    3 |  0.15 |    0.35 |  68.94
  360 |   47 |  2.35 |    5.53 |  74.47
  390 |    3 |  0.15 |    0.35 |  74.82
  420 |   22 |  1.10 |    2.59 |  77.41
  450 |    2 |  0.10 |    0.24 |  77.65
  480 |  127 |  6.34 |   14.94 |  92.59
  540 |   26 |  1.30 |    3.06 |  95.65
  600 |   24 |  1.20 |    2.82 |  98.47
  720 |   13 |  0.65 |    1.53 | 100.00
 <NA> | 1152 | 57.54 |    <NA> |   <NA>

16.2 取代缺失值 sjmisc::replace_na( )

#将缺失值以某一数值代入sjmisc::replace_na,
#并另存新变量(TCS2015small$G1.1.A.na2)
TCS2015small$G1.1.A.na2 <- replace_na(TCS2015small$G1.1.A.na, value = 294.33) 

#所有的NA都以平均数294.33代入
#呈现新变量G1.1.A.na2频数分布
frq(TCS2015small$G1.1.A.na2) #已无缺失值(NA)(原本的缺失值已被294.33取代)
G1.1.A.你每天利用电脑上网工作、学习的时间有多久? (x) <numeric> 
# total N=2002 valid N=2002 mean=275.14 sd=118.98

 Value |    N | Raw % | Valid % | Cum. %
----------------------------------------
 10.00 |    7 |  0.35 |    0.35 |   0.35
 15.00 |    2 |  0.10 |    0.10 |   0.45
 20.00 |    8 |  0.40 |    0.40 |   0.85
 23.00 |    1 |  0.05 |    0.05 |   0.90
 25.00 |    1 |  0.05 |    0.05 |   0.95
 27.00 |    1 |  0.05 |    0.05 |   1.00
 30.00 |   49 |  2.45 |    2.45 |   3.45
 35.00 |    1 |  0.05 |    0.05 |   3.50
 45.00 |    2 |  0.10 |    0.10 |   3.60
 50.00 |    1 |  0.05 |    0.05 |   3.65
 60.00 |  126 |  6.29 |    6.29 |   9.94
 62.00 |    1 |  0.05 |    0.05 |   9.99
 90.00 |   16 |  0.80 |    0.80 |  10.79
120.00 |  122 |  6.09 |    6.09 |  16.88
150.00 |    7 |  0.35 |    0.35 |  17.23
180.00 |   63 |  3.15 |    3.15 |  20.38
210.00 |    7 |  0.35 |    0.35 |  20.73
240.00 |  101 |  5.04 |    5.04 |  25.77
270.00 |    3 |  0.15 |    0.15 |  25.92
294.33 | 1152 | 57.54 |   57.54 |  83.47
300.00 |   64 |  3.20 |    3.20 |  86.66
330.00 |    3 |  0.15 |    0.15 |  86.81
360.00 |   47 |  2.35 |    2.35 |  89.16
390.00 |    3 |  0.15 |    0.15 |  89.31
420.00 |   22 |  1.10 |    1.10 |  90.41
450.00 |    2 |  0.10 |    0.10 |  90.51
480.00 |  127 |  6.34 |    6.34 |  96.85
540.00 |   26 |  1.30 |    1.30 |  98.15
600.00 |   24 |  1.20 |    1.20 |  99.35
720.00 |   13 |  0.65 |    0.65 | 100.00
  <NA> |    0 |  0.00 |    <NA> |   <NA>

17 计算次数 sjmisc::row_count( )

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

#载入R数据档
load("TCS2015small.rda")

#加载"sjmisc"套件包
library(sjmisc)

#频数分布
frq(TCS2015small$A1)
性别 (x) <categorical> 
# total N=2002 valid N=2002 mean=1.54 sd=0.50

Value | Label |    N | Raw % | Valid % | Cum. %
-----------------------------------------------
    1 |    男 |  928 | 46.35 |   46.35 |  46.35
    2 |    女 | 1074 | 53.65 |   53.65 | 100.00
 <NA> |  <NA> |    0 |  0.00 |    <NA> |   <NA>
#使用"sjmisc"套件的"rec"函数,将A1变量重新编码为一个二分类变量A1.rec (1="1:男性", 0= "0:女性")
library(sjmisc)
TCS2015small$A1.rec <- rec(TCS2015small$A1, 
                   rec =  "2=0; 1=1" ,
                   var.label = "性别",
                   val.labels = c("0:女性", "1:男性"),
                   as.num = FALSE
                   )
frq(TCS2015small$A1.rec)
性别 (x) <categorical> 
# total N=2002 valid N=2002 mean=0.46 sd=0.50

Value |  Label |    N | Raw % | Valid % | Cum. %
------------------------------------------------
    0 | 0:女性 | 1074 | 53.65 |   53.65 |  53.65
    1 | 1:男性 |  928 | 46.35 |   46.35 | 100.00
 <NA> |   <NA> |    0 |  0.00 |    <NA> |   <NA>
#使用"sjmisc"套件"rec"函数,将aga_strata变量重新编码为一个二分类变量(1="40(含)以上", 0= "0-39")
#age.strata.rec
frq(TCS2015small$age_strata)
年龄分层 (x) <categorical> 
# total N=2002 valid N=2002 mean=4.25 sd=1.56

Value |  Label |   N | Raw % | Valid % | Cum. %
-----------------------------------------------
    1 |  18-19 |  38 |  1.90 |    1.90 |   1.90
    2 |  20-29 | 242 | 12.09 |   12.09 |  13.99
    3 |  30-39 | 460 | 22.98 |   22.98 |  36.96
    4 |  40-49 | 363 | 18.13 |   18.13 |  55.09
    5 |  50-59 | 423 | 21.13 |   21.13 |  76.22
    6 |  60-69 | 294 | 14.69 |   14.69 |  90.91
    7 | 70以上 | 182 |  9.09 |    9.09 | 100.00
 <NA> |   <NA> |   0 |  0.00 |    <NA> |   <NA>
TCS2015small$age.strata.rec <- rec(TCS2015small$age_strata,
         rec =  "1:3=0; 4:7=1",
         var.label = "年龄二分类",
         val.labels = c("0:18-39", "1:40(含)以上"),
         as.num = FALSE #设置为类别变量
            )
frq(TCS2015small$age.strata.rec)
年龄二分类 (x) <categorical> 
# total N=2002 valid N=2002 mean=0.63 sd=0.48

Value |        Label |    N | Raw % | Valid % | Cum. %
------------------------------------------------------
    0 |      0:18-39 |  740 | 36.96 |   36.96 |  36.96
    1 | 1:40(含)以上 | 1262 | 63.04 |   63.04 | 100.00
 <NA> |         <NA> |    0 |  0.00 |    <NA> |   <NA>
frq(TCS2015small$A1.rec)
性别 (x) <categorical> 
# total N=2002 valid N=2002 mean=0.46 sd=0.50

Value |  Label |    N | Raw % | Valid % | Cum. %
------------------------------------------------
    0 | 0:女性 | 1074 | 53.65 |   53.65 |  53.65
    1 | 1:男性 |  928 | 46.35 |   46.35 | 100.00
 <NA> |   <NA> |    0 |  0.00 |    <NA> |   <NA>
#多变量多重取值的次数计算
#将TCS2015small数据档中的A1.rec变量与age.strata.rec两变量,挑出来(select)
#计算两变量中出现 "1"(count=1)的次数(rowcount)
#(A1.rec=1,男性;age.strata.rec=1,40含以上),
#计算结果另存新档(TCS2015small_count) 
library(sjmisc)
TCS2015small_count <- TCS2015small %>% #选择分析数据档
  select(A1.rec, age.strata.rec) %>% #挑选分析变量
  row_count(count = 1, append = TRUE) #计算分析变量出现1的次数

#呈现数据档(TCS2015sample_count)前面6个观察值,所有变量
head(TCS2015small_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(TCS2015small_count$rowcount) 
x <integer> 
# total N=2002 valid N=2002 mean=1.09 sd=0.67

Value |    N | Raw % | Valid % | Cum. %
---------------------------------------
    0 |  369 | 18.43 |   18.43 |  18.43
    1 | 1076 | 53.75 |   53.75 |  72.18
    2 |  557 | 27.82 |   27.82 | 100.00
 <NA> |    0 |  0.00 |    <NA> |   <NA>
#(结果发现):
#A1.rec不等于1 且age.strata.rec不等于1的观察值(value=0)有369个
#A1.rec等于1 或age.strata.rec等于1的观察值(value=1)有1076个
#A1.rec等于1 且age.strata.rec等于1的观察值(value=2)有557个

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

18.1 数据预备

#载入R数据档
load("TCS2015small.rda")

library(dplyr)
#将TCS2015small数据档中的ID与A2.age变量挑出来(select),另存新档(TCS2015small.subset)
TCS2015small.subset <- select(TCS2015small, ID, A2.age)

#看前六笔数据
head(TCS2015small.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)
TCS2015small.subset <- arrange(TCS2015small.subset, desc(A2.age))
head(TCS2015small.subset)
          ID A2.age
1 T231238135     96
2 T221232008     93
3 T521169043     92
4 T132222154     91
5 T231137089     90
6 T611177074     90

可以使用 dplyr套件包的 min_rank( ) 做数据大小排名。 也可以使用 dplyr套件包的 percent_rank( ) 做百分位排名。

18.2 dplyr::min_rank(desc( )) 数据大小排名方法一

数值愈大,排名愈前; 数值愈小,排名愈后一般用这个方法进行排名

#数值愈大,排名位次愈前,数值愈小,排名位次愈后(降幂排名)(一般用这个方法排序)
library(dplyr)

#将A2.age变量的最大数值,排名最前 min_rank(desc( )),
#并将排名后的结果,回存原数据并给予变量名称(rank1)
TCS2015small.subset$rank1 <- min_rank(desc(TCS2015small.subset$A2.age))

#呈现数值排名后的前面6笔观察值
head(select(TCS2015small.subset, ID, A2.age, rank1))
          ID A2.age rank1
1 T231238135     96     1
2 T221232008     93     2
3 T521169043     92     3
4 T132222154     91     4
5 T231137089     90     5
6 T611177074     90     5
#呈现数值排名后的后6笔观察值
tail(select(TCS2015small.subset, ID, A2.age, rank1))
             ID A2.age rank1
1997 T411153063     18  1989
1998 T412256104     18  1989
1999 T511266016     18  1989
2000 T511266232     18  1989
2001 T522272051     18  1989
2002 T611177057     18  1989

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

数值愈大,排名愈后; 数值愈小,排名愈前

library(dplyr)
#A2.age变量的数值愈大,排名愈后 min_rank( )
#并将排名后的结果,回存原数据并给予变量名称(rank2)
TCS2015small.subset$rank2 <- min_rank(TCS2015small.subset$A2.age)

#呈现数值排名后的前面6笔观察值
head(select(TCS2015small.subset, ID, A2.age, rank2))
          ID A2.age rank2
1 T231238135     96  2002
2 T221232008     93  2001
3 T521169043     92  2000
4 T132222154     91  1999
5 T231137089     90  1997
6 T611177074     90  1997

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

数值愈大,百分位位次排名愈靠前, 数值愈小,百分位位次排名愈靠后 一般用这个方法进行排名

library(dplyr)
#A2.age变量的数值愈大,百分位位次排名愈前percent_rank(desc( ))
#并将排名后的结果,回存原数据并给予变量名称(rank1.pct)
TCS2015small.subset$rank1.pct <- percent_rank(desc(TCS2015small.subset$A2.age))

#呈现百分位排名后的前面6笔观察值
head(select(TCS2015small.subset, ID, A2.age, rank1.pct))
          ID A2.age    rank1.pct
1 T231238135     96 0.0000000000
2 T221232008     93 0.0004997501
3 T521169043     92 0.0009995002
4 T132222154     91 0.0014992504
5 T231137089     90 0.0019990005
6 T611177074     90 0.0019990005
#呈现百分位排名后的后面6笔观察值
tail(select(TCS2015small.subset, ID, A2.age, rank1.pct))
             ID A2.age rank1.pct
1997 T411153063     18 0.9935032
1998 T412256104     18 0.9935032
1999 T511266016     18 0.9935032
2000 T511266232     18 0.9935032
2001 T522272051     18 0.9935032
2002 T611177057     18 0.9935032

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

数值愈大,百分位位次排名愈靠后; 数值愈小,百分位位次排名愈靠前

library(dplyr)
#A2.age变量的最大数值,给予最大百分位排名 percent_rank()
#并将排名后的结果,回存原数据并给予变量名称(rank2.pct)
TCS2015small.subset$rank2.pct <- percent_rank(TCS2015small.subset$A2.age)

#呈现百分比排名后的前面6笔观察值
head(select(TCS2015small.subset, A2.age, rank2.pct))
  A2.age rank2.pct
1     96 1.0000000
2     93 0.9995002
3     92 0.9990005
4     91 0.9985007
5     90 0.9975012
6     90 0.9975012
#呈现百分比排名后的后面笔观察值
tail(select(TCS2015small.subset, A2.age, rank2.pct))
     A2.age rank2.pct
1997     18         0
1998     18         0
1999     18         0
2000     18         0
2001     18         0
2002     18         0

18.6 不同排名方法的比较

#呈现不同排名方法结果的比较
head(TCS2015small.subset)
          ID A2.age rank1 rank2    rank1.pct rank2.pct
1 T231238135     96     1  2002 0.0000000000 1.0000000
2 T221232008     93     2  2001 0.0004997501 0.9995002
3 T521169043     92     3  2000 0.0009995002 0.9990005
4 T132222154     91     4  1999 0.0014992504 0.9985007
5 T231137089     90     5  1997 0.0019990005 0.9975012
6 T611177074     90     5  1997 0.0019990005 0.9975012

19 分组汇总 dplyr::group_by( ) (重要:常用)

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

使用 dplyr 套件包的 group_by( )函数 + sjmisc套件包的 frq( )函数, 可以呈现分组汇总的频数分布。

#载入R数据档
load("TCS2015small.rda")

#根据性别分层,呈现不同性别对于目前生活满不满意的频数分布
#加载"dplyr" 与 "sjmisc"套件
library(dplyr)
library(sjmisc)

#呈现变量(V1.1)的分组频数分布(frq)
#将结果另存新变量(sex_V1.1_frq)
sex_V1.1_frq <- TCS2015small %>% #使用数据TCS2015small
  group_by(A1) %>% #根据A1变量(性别)进行分组(1:男性;2:女性)
  frq(V1.1) #计算变量(V1.1)的频数分布

#呈现分组频数分布结果
print(sex_V1.1_frq)
V1.1. 整体而言,你对于你的生活满不满意 (V1.1) <categorical> 
# 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) <categorical> 
# 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>

19.2 分组汇总+平均数 dplyr::group_by( ) + dplyr::summarise( )(重要:常用)

使用 dplyr 套件包的 group_by( )函数 + dplyr 套件包的 summarise( )函数,可以呈现分组汇总的平均数。

#载入R数据档
load("TCS2015small.rda")

#加载"sjmisc"套件包
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>
#呈现变量(G4.2)的平均数(summarise(mean))
#将结果另存新变量(age_strata_mean )

#加载"dplyr"套件包
library(dplyr)
age_strata_mean <- TCS2015small %>% #使用数据TCS2015small
  group_by(age_strata) %>% #根据age_strata变量进行分组
  summarise(meanG4.2 = mean(G4.2, na.rm = TRUE)) #计算变量(G4.2)的平均数
  #記得要設定na.rm=T (排除缺失值)

#呈现分组平均数结果
print(age_strata_mean)
# A tibble: 7 × 2
  age_strata meanG4.2
  <fct>         <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
#去除 R 当前工作环境中所有的数据与物件
rm(list=ls( ))

本章小结

本章所使用到的R套件包与函数摘录如下表。

套件包 函数 说明
内建 setwd ( ) 設定工作目錄
getwd ( ) 顯示當前工作目錄
install.packages ( ) 下载套件包
library ( ) 加载套件包
save ( ) 将档案存成R数据资料档格式(*.rda)
load ( ) 载入R数据资料档(*.rda)
head ( ) 呈现数据档前六笔个案观察值
attributes ( ) 查看变量的属性特征及变量(值)标签
table ( ) 呈现变量的频数
levels ( ) 呈现类别变量的水平(有几类)
data.frame ( ) 将不同数据转换合并为一個数据框
rm (list=ls( )) 去除R当前工作环境中所有的数据与物件
dplyr select ( ) 选择分析变量
mutate ( ) 产生一个新的变量
arrange (, desc( )) 将特定变量依其数值由大到小排序
arrange ( ) 将特定变量依其数值由小到大排序
min_rank(, desc( )) 数值愈大排名愈前;数值愈小排名愈后
min_rank ( ) 数值愈小排名愈前;数值愈大排名愈后
percent_rank (, desc( )) 数值愈大位次愈前;数值愈小位次愈后
percent_rank ( ) 数值愈小位次愈前;数值愈大位次愈后
group_by ( ) 根据某个特定变量,进行分组
sjlabelled read_spss ( ) 将SPSS格式数据资料档(*.sav)汇入到R
to_numeric ( ) 將变量转换為数字变量
to_factor ( ) 將变量转换為类别变量
set_label ( ) 设置变量标签
set_labels ( ) 设置变量值标签
sjmisc frq ( ) 呈现变量的频数分布
rename_variables ( ) 重新命名变量的名称
find_var ( ) 寻找符合某种特定条件的变量
remove_var ( ) 删除变量
move_columns (, .before) 将变量移动到某一个变量之前
move_columns (, .after) 将变量移动到某一个变量之后
rec ( ) 将原始变量重新编码为另一新的变量
flat_table ( ) 呈现好几个变量的巢套频数分布,可以用来检查重新编码是否正确
split_var ( ) 将一个连续变量分割成大小约略相等的不同组别
dicho ( ) 将某一连续变量转换为二分类变量
add_variables (, .before) 创建新变量并放置在某个变量之前
add_variables (, .after) 创建新变量并放置在某个变量之后
add_id ( ) 创建观察值的id变量
to_dummy ( ) 根据某一类别变量的”类别数目”,创建出相对应的”虚拟变量数目”
replace_columns ( ) 纵向合并数据档(相同个案,不同变量)
std ( ) 将变量数值进行Z值标准化
center ( ) 将变量数值进行中心化
set_na ( ) 将特定数值设置为缺失值
replace_na ( ) 将缺失值以某一数值代入
row_count ( ) 计算特定观察值在不同变量出现的次数