我们通常会将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”)
#调用"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")
#把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
可以调用“sjmisc”套件中的“move_columns()”函数,将变量在数据档的位置,进行移动到某 个变量之前或之后。
将变量移动到某一个变量之前
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
将变量移动到某一个变量之后
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
可以调用“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
可以调用“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>
可以调用“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
#调用"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
可以调用“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
可以调用“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>
可以调用“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
也可以调用“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
可以调用“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
可以调用“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
可以调用“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个
可以调用“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
#数值最大,排名最前(一般用这个方法排序)
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
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
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
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
可以调用“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>
#将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>
#将缺失值以某一数值代入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>
可以调用“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>
可以调用“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
所谓多变量反覆加权(raking),就是将某一个样本变量比例(例如:样本性别比例)和母体比 例(例如:母体性别比例)做一比较对照后,研究者根据母体比例,将样本变量的比例调整 和母体比例一致,调整的方法是给予一个“权数”(母体比例除以样本比例)。
调整完第一个变量之后,接续调整第二个变量比例(例如:年级变量),再透过另外一个 权数,将第二个样本变量的比例调整和母体比例一致。
调整完第二个变量之后,继续调整第三个变量比例(例如:学系变量),再透过另外一个 权数,将第三个样本变量的比例调整和母体比例一致。
如此经过多个变量不断的反覆加权,直到研究者所设定的变量(例如:性别、学系、年级) 经过加权变量的设定后,都呈现出和母体比例一致的面貌。此时,我们就认为该样本能代表 母体,是一个具有“样本代表性”的样本。
具体的分析步骤如以下程式码所示。
#导入spss数据
library(sjlabelled)
stfood2019 <- read_spss("stfood2019.sav")
#将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>
#給予觀察值id編號
#调用sjmisc套件
library(sjmisc)
stfood2019<- add_id(stfood2019, var = "ID")
#输入变量的母体比例
#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")
#调用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")
#加权后频数分布表(加权变量:"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>
调用“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, #呈现加权后%
)
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 |
|
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 |
|
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 |
|
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 |
调用“stats”套件的“chisq.test”函数,可以检验原始样本的变量比例是否和母体比例一致。 如果p-value <=0.05,我们就说样本在该变量无法代表母体; 如果p-value>0.05,我们就说样本在该变量可以代表母体。
进行原始样本未加权的样本代表性检验。
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, 样本的学系比例,无法代表母体)
调用“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())
此处将本章所使用到的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() | 进行多变量反覆加权 |