1 工作环境设置

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

#呈现code 与output
knitr::opts_chunk$set(echo = TRUE) 
#设定当前工作目录(请选择一个你自己的工作目录)
setwd("/Users/simonfair/Desktop/量化研究数据分析/Ch4个案观察值的编辑与管理") 
#显示目前工作目录
getwd()
## [1] "/Users/simonfair/Desktop/量化研究数据分析/Ch4个案观察值的编辑与管理"
#设定系統中文文字編碼 (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”)


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 对于数据档个案观察值的编辑管理

3.1 筛选符合特定条件的个案 dplyr::filter() ; base::subset()

3.1.1 方法一 dplyr::filter()

我们可以调用“dplyr”套件中的“filter()”函数,将数据档根据某些标准筛选出来,成为一 个次样本。并可调用“sjPlot”套件中的“tab_df()”函数,呈现数据档的资料数目与变量数目

#调用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
#使用dplyr套件中的filter函数
filter <- filter(TCS2015small, age_strata == 1) 
#(选择TCS2015small数据档中的age_strata变量等于1的观察值,将选择后的数据档
#另外存成一个数据档,并将该数据档的名称设置为"filter")
#呈现数据档的前6笔资料,全部变量
head(filter)
##           ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 1 T111101160  2    1996     19          1    300    7      5      0    2
## 2 T112103140  1    1996     19          1     20    7      2      0    3
## 3 T112204131  1    1996     19          1     60    7      2      0    1
## 4 T113206217  1    1996     19          1      0    7      2      0    3
## 5 T121107009  1    1996     19          1    120    7      1      0    3
## 6 T123379217  2    1996     19          1      0    7      0     30    3

3.1.2 方法二 base::subset()

也可以使用R base中的“subset()”函数,进行特定观察值的选择。

age_strata.1 <- subset(TCS2015small, age_strata == 1)
#呈现数据档的前6笔资料,全部变量
head(age_strata.1)
##             ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 18  T111101160  2    1996     19          1    300    7      5      0    2
## 57  T112103140  1    1996     19          1     20    7      2      0    3
## 74  T112204131  1    1996     19          1     60    7      2      0    1
## 130 T113206217  1    1996     19          1      0    7      2      0    3
## 133 T121107009  1    1996     19          1    120    7      1      0    3
## 288 T123379217  2    1996     19          1      0    7      0     30    3

3.2 随机抽取部分样本 dplyr::sample_frac();dplyr::sample_n(); dplyr::slice()

3.2.1 dplyr::sample_frac()

使用“dplyr”套件中的“sample_frac()”函数,随机选取某一特定比例(例如1%)的 部分样本。

#调用"dplyr" 套件
library(dplyr)
#选取一定比例的样本(例如1%)
s1 <- sample_frac(TCS2015small, 0.01, replace = TRUE)
#呈现数据档的前6笔资料,全部变量
head(s1)
##           ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 1 T521169144  1    1959     56          5    240   NA     NA     NA    3
## 2 T421157108  2    1978     37          3      0    1      0     30    3
## 3 T125216190  1    1988     27          2    480    7      1      0    2
## 4 T311240107  1    1950     65          6     NA   NA     NA     NA    3
## 5 T131220140  2    1963     52          5    240    7      0     10    3
## 6 T221131010  2    1964     51          5      0   NA     NA     NA    3

3.2.2 dplyr::sample_n()

使用“dplyr”套件中的“sample_n()”函数,随机选取固定个案数(例如30个)的样本

#调用"dplyr" 套件
library(dplyr)
#选取固定个案数据的样本(例如30个样本)
s2 <- sample_n(TCS2015small, 30, replace = TRUE)
#调用"sjPlot" 套件
library(sjPlot)
#呈现数据档的前6笔资料,全部变量
head(s1)
##           ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 1 T521169144  1    1959     56          5    240   NA     NA     NA    3
## 2 T421157108  2    1978     37          3      0    1      0     30    3
## 3 T125216190  1    1988     27          2    480    7      1      0    2
## 4 T311240107  1    1950     65          6     NA   NA     NA     NA    3
## 5 T131220140  2    1963     52          5    240    7      0     10    3
## 6 T221131010  2    1964     51          5      0   NA     NA     NA    3

3.2.3 dplyr::slice()

使用“dplyr”套件中的“sample_slice()”函数,选取固定row(行数)的样本(例如10-15行)

#调用"dplyr" 套件
library(dplyr)
#选取固定row(行数)的样本(例如10-15行)
s3 <- slice(TCS2015small, 10:15)
#呈现数据档的前6笔资料,全部变量
head(s3)
##           ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 1 T111101089  1    1935     80          7     NA   NA     NA     NA    3
## 2 T111101105  1    1964     51          5    300    7      1      0    3
## 3 T111101109  2    1978     37          3    420    7      5      0    2
## 4 T111101112  1    1977     38          3     90    7      0     30    3
## 5 T111101121  1    1952     63          6     NA   NA     NA     NA    2
## 6 T111101134  1    1944     71          7      0    1      0     10    2

从TCS2015small抽取前100个观察值,另存新档(TCS2015sample.rda)做为后面的数据分析 之用

#调用"dplyr" 套件
library(dplyr)
TCS2015sample <- slice(TCS2015small, 1:99, replace = TRUE)
#呈现数据档的观察值与变量数目
dim(TCS2015sample) #100个观察值 10个变量
## [1] 100  10
#存成R数据檔
save(TCS2015sample, file = "TCS2015sample.rda")
#把R数据档叫进来
load("TCS2015sample.rda")

3.3 增加新个案 sjmisc::add_case()

可以使用“sjmisc”套件中的“add_case()”函数,增加新的个案并赋予其在不同变量中的数值 ,且可设置新个案所处的位置(在某一个row之前或之后)。

3.3.1 sjmisc::add_case(,.before)

#调用"sjmisc" 套件
library(sjmisc)
#增加新观察值,此一观察值在A1变量=3, 在A2.age变量=55, 位置放在原资料档
#第一个row之前,并另存新档
TCS2015sample_addcase <- add_case(TCS2015sample,A1 = 3, A2.age = 55,.before = 1) 
#呈现前6笔资料,全部变量
head(TCS2015sample_addcase)
##             ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 101       <NA>  3      NA     55         NA     NA   NA     NA     NA   NA
## 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

3.3.2 sjmisc::add_case(,.after)

#增加新观察值,此一观察值在A1变量=3, 在A2.age变量=55, 位置放在原资料档
#第一个row之后,并另存新档
TCS2015sample_addcase <- add_case(TCS2015sample,A1 = 3, A2.age = 55,.after = 1)
#呈现前6笔资料,全部变量
head(TCS2015sample_addcase)
##             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
## 101       <NA>  3      NA     55         NA     NA   NA     NA     NA   NA
## 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

3.4 排序 dplyr::arrange(,desc()); dplyr::arrange()

使用“dplyr”套件中的“arrange()”函数,将特定变量依其数值由大到小或由小到大排序。

3.4.1 dplyr::arrange(,desc())

#调用"dplyr" 套件
library(dplyr)
#根据G1.1.A变量(你每天利用电脑上网工作、学习的时间有多久?)由大到小排序,
#并另存新档
TCS2015sample_sort_desc <- arrange(TCS2015sample, desc(G1.1.A))
#呈现前6笔资料,全部变量
head(TCS2015sample_sort_desc) 
##           ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 1 T112204111  1    1981     34          3    720    7      2      0    4
## 2 T111202070  1    1969     46          4    600    7      5      0    3
## 3 T112103062  1    1988     27          2    600    7      2      0    3
## 4 T112103182  1    1989     26          2    600    7     10      0    2
## 5 T112103219  1    1973     42          4    540    7      1     30    2
## 6 T112204014  1    1985     30          3    540    7      4      0    3

3.4.2 dplyr::arrange()

#调用"dplyr" 套件
library(dplyr)
#根据G4.2变量(请问你一周会使用社交媒体几天?)由小到大排序,并另存新档
TCS2015sample_sort_asc <- arrange(TCS2015sample,G4.2)
#呈现前6笔资料,全部变量
head(TCS2015sample_sort_asc) 
##           ID A1 A2.year A2.age age_strata G1.1.A G4.2 G4.3.1 G4.3.2 V1.1
## 1 T111202125  2    1976     39          3    480  0.5      0      5    3
## 2 T112103048  2    1967     48          4    360  0.5      1      0    3
## 3 T112103195  1    1964     51          5    360  0.5      0     10    3
## 4 T112204146  1    1940     75          7     60  0.5      0     20    3
## 5 T111101134  1    1944     71          7      0  1.0      0     10    2
## 6 T111202190  2    1969     46          4    480  1.0      0      5    3

3.5 合并两个数据档 dplyr::bind_rows() ;dplyr::bind_cols()

可以使用“dplyr”套件中的“bind_rows()”函数,将具有同样变量名称的两个数据档,以增加 新个案的方式,加以合并。具体程式码如下。

3.5.1 dplyr::bind_rows()

#调用"sjlabelled" 套件
library(sjlabelled)
#汇入spss数据档TCS2015sample_a
TCS2015sample_a <- read_spss("TCS2015sc_a.sav") 
#察看数据档TCS2015sample_a的观察值数目与变量数目
dim(TCS2015sample_a) #800个观察值,5個變量
## [1] 800   5
#汇入spss数据档TCS2015sample_b
TCS2015sample_b <- read_spss("TCS2015sc_b.sav") 
#察看数据档TCS2015sample_b的观察值数目与变量数目
dim(TCS2015sample_b)#200个观察值,5個變量
## [1] 200   5
#调用"dplyr" 套件
library(dplyr)
#以增加新个案的方式(bind_rows),合并数据档,并另存新档(mydf_bind_rows)
mydf_bind_rows <- bind_rows(TCS2015sample_a, TCS2015sample_b)
#察看合并后新数据档(mydf_bind_rows)的观察值数目与变量数目
dim(mydf_bind_rows) #1000个观察值, 5 个变量
## [1] 1000    5
#作合并后新数据档A1变量(mydf_bind_rows$A1)的频数分布(frq)
frq(mydf_bind_rows$A1) #A1变量的频数分布
## 
## x <numeric>
## # total N=1000  valid N=1000  mean=1.51  sd=0.50
## 
## Value |   N | Raw % | Valid % | Cum. %
## --------------------------------------
##     1 | 491 | 49.10 |   49.10 |  49.10
##     2 | 509 | 50.90 |   50.90 | 100.00
##  <NA> |   0 |  0.00 |    <NA> |   <NA>

3.5.2 dplyr::bind_cols()

可以使用“dplyr”套件中的“bind_cols()”函数,将具有“相同观察值”但“变量名称不同”的 两个数据档,以增加新变量的方式,加以合并。合并时需依据两个数据档共同的关键变量 ,先行排序,再进行合并。

#调用"sjlabelled" 套件
library(sjlabelled)
#汇入spss数据档c
TCS2015sample_c <- read_spss("TCS2015sc_c.sav") 
#汇入spss数据档d
TCS2015sample_d <- read_spss("TCS2015sc_d.sav") 
#调用"sjPlot" 套件
#呈现数据档(TCS2015sample_c)前6笔资料,全部变量
head(TCS2015sample_c) # 
##           ID strata A1 A2.age age_strata
## 1 T111101006      1  2     38          3
## 2 T111101016      1  2     47          4
## 3 T111101039      1  2     27          2
## 4 T111101040      1  1     57          5
## 5 T111101042      1  2     57          5
## 6 T111101047      1  1     27          2
#呈数据档(TCS2015sample_d)前6笔资料,全部变量
head(TCS2015sample_d) # 
##           ID V1.1 V1.2 V1.3 V1.4 V1.5
## 1 T111101006    3    3    3    3    3
## 2 T111101016    3    3    3    3    3
## 3 T111101039    2    2    4    2    2
## 4 T111101040    3    4    3    3    3
## 5 T111101042    3    4    4    4    4
## 6 T111101047    2    3    4    3    3
#(两个数据档有一个相同变量:"ID")

#將两个数据档按照关键变量(例如:ID变量)由小到大進行排序
#调用"dplyr" 套件
library(dplyr)
#将数据档TCS2015sample_c按照ID编号由小到大進行排序(arrange),并另存新档
TCS2015sample_c_arrange <- arrange(TCS2015sample_c,ID)
#将数据档TCS2015sample_d按照ID编号由小到大進行排序(arrange),并另存新档
TCS2015sample_d_arrange <- arrange(TCS2015sample_d,ID)

#进行数据档的合并
#调用"dplyr" 套件
library(dplyr)
#将两个经过排序后的数据档,以新增变量(bind_cols)的方式,进行合并
mydf_bind_cols <- bind_cols(TCS2015sample_c_arrange, TCS2015sample_d_arrange)
## New names:
## * ID -> ID...1
## * ID -> ID...6
#呈现数据档(mydf_bind_cols)前面6个观察值,所有变量
head(mydf_bind_cols) #合并后有11个变量
##       ID...1 strata A1 A2.age age_strata     ID...6 V1.1 V1.2 V1.3 V1.4 V1.5
## 1 T111101006      1  2     38          3 T111101006    3    3    3    3    3
## 2 T111101016      1  2     47          4 T111101016    3    3    3    3    3
## 3 T111101039      1  2     27          2 T111101039    2    2    4    2    2
## 4 T111101040      1  1     57          5 T111101040    3    4    3    3    3
## 5 T111101042      1  2     57          5 T111101042    3    4    4    4    4
## 6 T111101047      1  1     27          2 T111101047    2    3    4    3    3
#刪除重複的id变量(ID...6),并另存数据档,设置新的数据档名称
#调用"sjmisc" 套件
library(sjmisc)
#删除"ID...6"变量(remove_vars)并另存新档(mydf_bind_cols_id)
mydf_bind_cols_id <- remove_var(mydf_bind_cols, "ID...6")
## 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.
#呈现数据档mydf_bind_cols_id前面6个观察值,所有变量
head(mydf_bind_cols_id) #有10个变量
##       ID...1 strata A1 A2.age age_strata V1.1 V1.2 V1.3 V1.4 V1.5
## 1 T111101006      1  2     38          3    3    3    3    3    3
## 2 T111101016      1  2     47          4    3    3    3    3    3
## 3 T111101039      1  2     27          2    2    2    4    2    2
## 4 T111101040      1  1     57          5    3    4    3    3    3
## 5 T111101042      1  2     57          5    3    4    4    4    4
## 6 T111101047      1  1     27          2    2    3    4    3    3
#调用"sjmisc" 套件
library(sjmisc)
#將"ID...1"变量名稱更名(rename_variables)為"ID",并另存新档(mydata)
mydata <- rename_variables(mydf_bind_cols_id, ID...1 = "ID")
#呈现数据档(mydata)前面6个观察值,所有变量
head(mydata) #有10个变量,"ID"变量名称已修正
##           ID strata A1 A2.age age_strata V1.1 V1.2 V1.3 V1.4 V1.5
## 1 T111101006      1  2     38          3    3    3    3    3    3
## 2 T111101016      1  2     47          4    3    3    3    3    3
## 3 T111101039      1  2     27          2    2    2    4    2    2
## 4 T111101040      1  1     57          5    3    4    3    3    3
## 5 T111101042      1  2     57          5    3    4    4    4    4
## 6 T111101047      1  1     27          2    2    3    4    3    3

3.6 转置数据档 sjmisc::rotate_df()

可以使用“sjmisc”套件中的“rodata_df()”函数,进行位置转置(transpose),将数据档的 row转成column, col转成row。

#调用"sjmisc"套件
library(sjmisc)
#挑选数据档的部分资料(观察值row,1:5 ; 变量columm 1:10),另存新档(x)
x <- TCS2015sample[1:5, 1:10]
#呈现X数据档
x
##           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
#使用"rotate_df"函数,进行数据档的转置,并另存新档(x2)
x2<-rotate_df(x)
#呈现X2数据档
x2
##                     1          2          3          4          5
## ID         T111101006 T111101016 T111101039 T111101040 T111101042
## A1                  2          2          2          1          2
## A2.year          1977       1968       1988       1958       1958
## A2.age             38         47         27         57         57
## age_strata          3          4          2          5          5
## G1.1.A             30        180          0        480        120
## G4.2                7          2          7          5          7
## G4.3.1              1          0          2          0          0
## G4.3.2              0          5          0         30         10
## V1.1                3          3          2          3          3
#去除 R 当前工作环境中所有的数据与物件
rm(list=ls())    

4 本章小结

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

本章所使用的R套件与函数
套件 函数 说明
base setwd() 设定当前工作目录
getwd() 显示当前工作目录
install.packages() 下载套件
library() 调用套件
save() 将档案存成R数据资料档格式(*.rda)
load() 载入R数据资料档(*.rda)
head() 呈现数据档前六笔个案观察值
dim() 呈现数据档的观察值数目与变量数目
subset() 将数据档根据某些标准筛选出来成为一个次样本
rm(list=ls()) 去除R当前工作环境中所有的数据与物件
dplyr filter() 将数据档根据某些标准筛选出来成为一个次样本
sample_frac() 随机选取某一特定比例的部分样本
slice() 选取固定rows(行数)的样本
arrange(,desc()) 将特定变量依其数值由大到小排序
arrange() 将特定变量依其数值由小到大排序
bind_rows() 以增加新个案的方式,合并两个数据档
bind_cols() 以增加新变量的方式,合并两个数据档
sjlabelled read_spss() 将SPSS格式数据资料档(*.sav)汇入到R
sjmisc add_case()(,.before) 增加新个案并将个案放置在某个row(行)之前
add_case()(,.after) 增加新个案并将个案放置在某个row(行)之后
remove_var() 删除变量
rename() 变更变量的名称
rotate_df() 将数据档的row(行)与column(列)进行转置