我们通常会将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”)
#调用"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")
我们可以调用“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
也可以使用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
使用“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
使用“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
使用“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")
可以使用“sjmisc”套件中的“add_case()”函数,增加新的个案并赋予其在不同变量中的数值 ,且可设置新个案所处的位置(在某一个row之前或之后)。
#调用"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
#增加新观察值,此一观察值在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
使用“dplyr”套件中的“arrange()”函数,将特定变量依其数值由大到小或由小到大排序。
#调用"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
#调用"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
可以使用“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>
可以使用“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
可以使用“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())
此处将本章所使用到的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(列)进行转置 |