1 RStudio 介面环境介绍

RStudion 的介面环境可分为四大块:Source(程序编辑视窗)、Console(控制台视窗)、 Enviroment/History(环境视窗)以及Files/Plots/Packages/Help/Tutorial/Viewer/Presentation(档案/绘图/套件…视窗)

2 RStudio工作环境设置(设置一次即可)

我们通常会将R的工作环境先进行一些设置,这些设置包括了「设置系统默认目录」、「设置文字编码类型」、「设置字体格式大小」、「设置套件下载点」等。

3 专案工作环境设置(设置一次即可)

当我们开始进行分析前,需要先「设置当前工作目录」、「设置系統中文文字编码」、以及「设置绘图物件中的中文文字」等项,以下是一些操作范例。

#呈现code 与output
knitr::opts_chunk$set(echo = TRUE) 
#设定当前工作目录(请选择一个你自己的工作目录)
setwd("/Users/simonfair/Desktop/闽南师范大学/量化培训班/(3)20230319") 
#显示目前工作目录
getwd()
## [1] "/Users/simonfair/Desktop/闽南师范大学/量化培训班/(3)20230319"
#设定系統中文文字編碼 (mac/win)
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"
#查看目前的系统编码
Sys.getlocale() #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)

4 R:可作为计算机进行数学运算

#参照讲义:量化资料分析p.204
1+3+5+7+9 #25
## [1] 25
(1+3+5+7+9)/5 #5
## [1] 5
(1-5)^2+(3-5)^2+(5-5)^2+(7-5)^2+(9-5)^2 #40
## [1] 40
5-1 #4
## [1] 4
40/4 #10 (方差)
## [1] 10
sqrt(10) #3.16(标准差)
## [1] 3.162278

5 R套件(packages)

R是一个开放软件,进行数据分析时需要仰赖各方人士所开发的”套件”(packages),这些套件需要「下载安装」(install.packages)并进行「调用」(library)。如同手机的APP,需先下载到手机中,待需要用到时再开启该套件。

R内建套件:base, stats, graphics, utils 本次练习所需下载套件: “haven”, “readxl”, sjlabelled”, “sjPlot”, “sjmisc”, “sjstats”, “dplyr”

6 Excel数据导入

6.1 Excel data(readxl::read_excel)

要导入Excel数据档(档名:stfoodEx.xlsx), 需先下载”readxl”套件:install.packages(“readxl”) 再调用”readxl”套件: library(readxl) 然后再透过函数:read_excel 将Excel数据档汇入到R软件:stfoodEx.xlsx <- read_excel(“stfoodEx.xlsx”)

#下载"readxl"套件
#install.packages("readxl")
#调用"readx1" 套件
library(readxl) 
#将excel数据汇入到R
stfoodEx.xlsx <- read_excel("stfoodEx.xlsx")

接下来,可以下载并调用”sjPlot”套件,使用”view_df”函数及一些指令,呈现该数据的编码状况(coding book)。

#呈现编码簿(sjPlot::view_df)
#install.packages("sjPlot")
#调用"sjPlot"套件
library(sjPlot)
## Learn more about sjPlot with 'browseVignettes("sjPlot")'.
view_df(stfoodEx.xlsx,   #指明R资料档的档案名称
        show.na = TRUE,  #呈现缺失值
        show.frq = TRUE, #呈现频数分布
        show.prc = TRUE) #呈现百分比 
Data frame: stfoodEx.xlsx
ID Name Label missings Values Value Labels Freq. %
1 Q1 0 (0.00%) range: 1-2
2 Q2 0 (0.00%) range: 1-4
3 Q3 0 (0.00%) range: 1-6
4 Q5 0 (0.00%) range: 1-5
5 Q7_1 0 (0.00%) range: 0-1
6 Q7_2 0 (0.00%) range: 0-1
7 Q7_3 0 (0.00%) range: 0-1
8 Q7_4 0 (0.00%) range: 0-1
9 Q7_5 0 (0.00%) range: 0-1
10 Q7_6 0 (0.00%) range: 0-1
11 Q14 0 (0.00%) range: 1-5
        #目前没有任何标签

6.2 设置变量标签与变量值标签(sjlabelled::set_label; sjlabelled::set_labels)

从外部数据汇进R的档案(如Excel档案)大部分都只有变量的数值代码,但没有变量的标签说明(variable label), 也没有变量值的标签说明(value label), 所以需要研究者进一步设置。

我们可以调用 “sjlabelled”套件的”set label()“函数进行”变量”标签的设置; “set labels()” 函数, 进行”变量值”标签的设置。 具体语法例示如下:

#调用sjlabelled套件
library(sjlabelled)
#增加变量标签(set_label)与变量值标签(set_labels)
#Q1
stfoodEx.xlsx$Q1 <- set_label(stfoodEx.xlsx$Q1,
                    label = "Q1请问您的性别")
stfoodEx.xlsx$Q1 <- set_labels(stfoodEx.xlsx$Q1,
                    labels = c("男", "女"))
#Q2
stfoodEx.xlsx$Q2 <- set_label(stfoodEx.xlsx$Q2,
                    label = "Q2请问您是大几的学生")
stfoodEx.xlsx$Q2 <- set_labels(stfoodEx.xlsx$Q2,
                    labels = c("大一", "大二", "大三", "大四"))
#Q3
stfoodEx.xlsx$Q3 <- set_label(stfoodEx.xlsx$Q3,
                     label = "Q3请问您目前就读的专业")
stfoodEx.xlsx$Q3 <- set_labels(stfoodEx.xlsx$Q3,
                    labels = c("新闻学", "编辑出版学", "传播学",
                               "网络与新媒体", 
                               "数字媒体艺术","数字媒体技术"))
#Q5
stfoodEx.xlsx$Q5 <- set_label(stfoodEx.xlsx$Q5,
                    label =  
                    "Q5平均来说,请问您一个月吃饭大概花多少钱")
stfoodEx.xlsx$Q5 <- set_labels(stfoodEx.xlsx$Q5,
                    labels = c("500以下", "501-1000", "1001-1500",
                               "1501-2000","2001以上"))
#Q7_1
stfoodEx.xlsx$Q7_1 <- set_label(stfoodEx.xlsx$Q7_1,
                      label = "Q7_1因为外卖节省排队时间")
#Q7_2
stfoodEx.xlsx$Q7_2 <- set_label(stfoodEx.xlsx$Q7_2,
                      label = "Q7_2因为外卖选择多")
#Q7_3
stfoodEx.xlsx$Q7_3 <- set_label(stfoodEx.xlsx$Q7_3,
                      label = "Q7_3因为食堂太挤")
#Q7_4
stfoodEx.xlsx$Q7_4 <- set_label(stfoodEx.xlsx$Q7_4,
                      label = "Q7_4因为有时外卖有红包拿,便宜")
#Q7_5
stfoodEx.xlsx$Q7_5 <- set_label(stfoodEx.xlsx$Q7_5,
                       label = "Q7_4因为想偶尔改变一下伙食")
#Q7_6
stfoodEx.xlsx$Q7_6 <- set_label(stfoodEx.xlsx$Q7_6,
                      label = "Q7_6其他")
#Q14  
stfoodEx.xlsx$Q14 <- set_label(stfoodEx.xlsx$Q14,
                      label =
                "Q14总体来说,对于食堂所提供的餐食服务,您满不满意")
stfoodEx.xlsx$Q14 <- set_labels(stfoodEx.xlsx$Q14,
                    labels = c("非常不满意", "不太满意", "一般/普通",
                               "还算满意", "非常满意"))

6.3 查看变量标签与变量值标签(sjlabelled::get_label; sjlabelled::get_labels)

可以透过”sjlabelled”套件的”get_label()“函数查看数据中每个”变量”的标签说明,“get_labels()”函数查看每个”变量值”的标签说明。

library(sjlabelled)
get_label(stfoodEx.xlsx)
##                                                  Q1 
##                                    "Q1请问您的性别" 
##                                                  Q2 
##                              "Q2请问您是大几的学生" 
##                                                  Q3 
##                            "Q3请问您目前就读的专业" 
##                                                  Q5 
##          "Q5平均来说,请问您一个月吃饭大概花多少钱" 
##                                                Q7_1 
##                          "Q7_1因为外卖节省排队时间" 
##                                                Q7_2 
##                                "Q7_2因为外卖选择多" 
##                                                Q7_3 
##                                  "Q7_3因为食堂太挤" 
##                                                Q7_4 
##                    "Q7_4因为有时外卖有红包拿,便宜" 
##                                                Q7_5 
##                        "Q7_4因为想偶尔改变一下伙食" 
##                                                Q7_6 
##                                          "Q7_6其他" 
##                                                 Q14 
## "Q14总体来说,对于食堂所提供的餐食服务,您满不满意"
get_labels(stfoodEx.xlsx)
## $Q1
## [1] "男" "女"
## 
## $Q2
## [1] "大一" "大二" "大三" "大四"
## 
## $Q3
## [1] "新闻学"       "编辑出版学"   "传播学"       "网络与新媒体" "数字媒体艺术"
## [6] "数字媒体技术"
## 
## $Q5
## [1] "500以下"   "501-1000"  "1001-1500" "1501-2000" "2001以上" 
## 
## $Q7_1
## NULL
## 
## $Q7_2
## NULL
## 
## $Q7_3
## NULL
## 
## $Q7_4
## NULL
## 
## $Q7_5
## NULL
## 
## $Q7_6
## NULL
## 
## $Q14
## [1] "非常不满意" "不太满意"   "一般/普通"  "还算满意"   "非常满意"

将各个变量的标签及变量值的标签设置好之后, 我们可以调用”sjPlot”套件中的”view_df”函数,一次清楚呈现各个变量的名称(Names)、变量标签(Variable Labels)、 变量值(Values)、变量值标签(Value Labels)、 频数分布(Freq.)以及百分比(%)等相关资讯。 这些资讯构成了我们常说的”编码簿”(coding book)

6.4 呈现编码簿(未加权)(sjPlot::view_df)

#呈现编码簿
library(sjPlot)
view_df(stfoodEx.xlsx,   #指明R资料档的档案名称
        show.na = TRUE,  #呈现缺失值
        show.frq = TRUE, #呈现频数分布
        show.prc = TRUE) #呈现百分比 
Data frame: stfoodEx.xlsx
ID Name Label missings Values Value Labels Freq. %
1 Q1 Q1请问您的性别 0 (0.00%) 1
2

415
643
39.22
60.78
2 Q2 Q2请问您是大几的学生 0 (0.00%) 1
2
3
4
大一
大二
大三
大四
243
299
227
289
22.97
28.26
21.46
27.32
3 Q3 Q3请问您目前就读的专业 0 (0.00%) 1
2
3
4
5
6
新闻学
编辑出版学
传播学
网络与新媒体
数字媒体艺术
数字媒体技术
166
223
288
135
215
31
15.69
21.08
27.22
12.76
20.32
2.93
4 Q5 Q5平均来说,请问您一个月吃饭大概花多少钱 0 (0.00%) 1
2
3
4
5
500以下
501-1000
1001-1500
1501-2000
2001以上
10
136
387
418
107
0.95
12.85
36.58
39.51
10.11
5 Q7_1 Q7_1因为外卖节省排队时间 0 (0.00%) range: 0-1
6 Q7_2 Q7_2因为外卖选择多 0 (0.00%) range: 0-1
7 Q7_3 Q7_3因为食堂太挤 0 (0.00%) range: 0-1
8 Q7_4 Q7_4因为有时外卖有红包拿,便宜 0 (0.00%) range: 0-1
9 Q7_5 Q7_4因为想偶尔改变一下伙食 0 (0.00%) range: 0-1
10 Q7_6 Q7_6其他 0 (0.00%) range: 0-1
11 Q14 Q14总体来说,对于食堂所提供的餐食服务,您满不满意 0 (0.00%) 1
2
3
4
5
非常不满意
不太满意
一般/普通
还算满意
非常满意
18
103
411
473
53
1.70
9.74
38.85
44.71
5.01
        #此时有标签了!

6.5 查看变量的属性和结构(class;str)

变量(variable)一般可分为「类别变量」(categorical variables)(定类变量、定序变量) 与「连续变量」(numeric variables)(定距变量、定比变量)两大属性。 有关不同测量尺度的变量分类(类别变量vs.连续变量), 参考讲义p.195 表11-2

R对于变量的属性设置是很敏感的,关系到不同属性的变量会适用到 各自不同的统计分析方法。因此,在进行数据分析之前,研究者需针对 所欲分析的变量,进行变量属性的设置。

我们可以透过”class()“函数,查看变量的属性。 输出如果显示”factor”代表该变量被设置为 「类别变量」, 如果显示”numeric”代表该变量被设置为「连续变量」。 也可以使用”str” 函数,同时查看变量的属性(factor vs. numeric)、 (如果是类别变量的话)分成几类 (levels)、以及变量的前几笔资料。 当数据被载入到R,如果没有做任何的设置,R会将数据中的各个变量默认为「连续变量」。

class(stfoodEx.xlsx$Q1) #"numeric"
## [1] "numeric"
class(stfoodEx.xlsx$Q7_1) #"numeric"
## [1] "numeric"
class(stfoodEx.xlsx$Q14) #"numeric"
## [1] "numeric"
str(stfoodEx.xlsx$Q1)
##  num [1:1058] 2 1 2 2 1 2 2 2 2 1 ...
##  - attr(*, "label")= chr "Q1请问您的性别"
##  - attr(*, "labels")= Named num [1:2] 1 2
##   ..- attr(*, "names")= chr [1:2] "男" "女"
str(stfoodEx.xlsx$Q7_1)
##  num [1:1058] 1 0 1 1 1 1 1 0 1 0 ...
##  - attr(*, "label")= chr "Q7_1因为外卖节省排队时间"
str(stfoodEx.xlsx$Q14)
##  num [1:1058] 4 4 4 4 4 2 4 3 3 4 ...
##  - attr(*, "label")= chr "Q14总体来说,对于食堂所提供的餐食服务,您满不满意"
##  - attr(*, "labels")= Named num [1:5] 1 2 3 4 5
##   ..- attr(*, "names")= chr [1:5] "非常不满意" "不太满意" "一般/普通" "还算满意" ...

6.6 设置(改变)变量的属性(sjlabelled::to_factor; sjlabelled::to_numeric)

假如我们要将数据中的一些变量设置为「类别变量」,则可调用”sjlabelled”套件的 “to_factor()”函数,来完成这项工作。如果要将数据中的一些变量设置为「连续变量」,则可调用”sjlabelled”套件的”to_numeric()“函数,来完成这项工作。

library(sjlabelled)
#将numeric(连续变量)->factor(类别变量)
class(stfoodEx.xlsx$Q1) #numeric
## [1] "numeric"
library(sjlabelled)
stfoodEx.xlsx$Q1 <- to_factor(stfoodEx.xlsx$Q1)
class(stfoodEx.xlsx$Q1) #factor
## [1] "factor"
#将factor(类别变量)->numeric(连续变量)
class(stfoodEx.xlsx$Q1) #factor
## [1] "factor"
stfoodEx.xlsx$Q1 <- to_numeric(stfoodEx.xlsx$Q1)
class(stfoodEx.xlsx$Q1) #numeric
## [1] "numeric"
#将numeric(连续变量)->factor(类别变量)
stfoodEx.xlsx$Q1 <- to_factor(stfoodEx.xlsx$Q1)
class(stfoodEx.xlsx$Q1) #factor
## [1] "factor"
stfoodEx.xlsx$Q2 <- to_factor(stfoodEx.xlsx$Q2)
stfoodEx.xlsx$Q3 <- to_factor(stfoodEx.xlsx$Q3)
stfoodEx.xlsx$Q5 <- to_factor(stfoodEx.xlsx$Q5)
stfoodEx.xlsx$Q7_1 <- to_factor(stfoodEx.xlsx$Q7_1)
stfoodEx.xlsx$Q7_2 <- to_factor(stfoodEx.xlsx$Q7_2)
stfoodEx.xlsx$Q7_3 <- to_factor(stfoodEx.xlsx$Q7_3)
stfoodEx.xlsx$Q7_4 <- to_factor(stfoodEx.xlsx$Q7_4)
stfoodEx.xlsx$Q7_5 <- to_factor(stfoodEx.xlsx$Q7_5)
stfoodEx.xlsx$Q7_6 <- to_factor(stfoodEx.xlsx$Q7_6)
stfoodEx.xlsx$Q14 <- to_factor(stfoodEx.xlsx$Q14)

class(stfoodEx.xlsx$Q1) #factor
## [1] "factor"
class(stfoodEx.xlsx$Q2) #factor
## [1] "factor"
class(stfoodEx.xlsx$Q3) #factor
## [1] "factor"
class(stfoodEx.xlsx$Q5) #factor
## [1] "factor"
class(stfoodEx.xlsx$Q7_1) #factor
## [1] "factor"
class(stfoodEx.xlsx$Q7_2) #factor
## [1] "factor"
class(stfoodEx.xlsx$Q7_3) #factor
## [1] "factor"
class(stfoodEx.xlsx$Q7_4) #factor
## [1] "factor"
class(stfoodEx.xlsx$Q7_5) #factor
## [1] "factor"
class(stfoodEx.xlsx$Q7_6) #factor
## [1] "factor"
class(stfoodEx.xlsx$Q14) #factor
## [1] "factor"

6.7 存成R数据档save(x,file=*.rda)

#将已设置好标签的数据资料,存档(*.rda)
save(stfoodEx.xlsx, file = "stfoodEx.xlsx.rda")

6.8 载入R数据档load(*.rda)

#载入已设置好标签的数据资料档(*.rda)
load("stfoodEx.xlsx.rda")

6.9 频数分布sjmisc::frq()

调用”sjmisc”套件的”frq”函数

#调用"sjmisc"套件
library(sjmisc)
#频数分布
frq(stfoodEx.xlsx$Q14)
## Q14总体来说,对于食堂所提供的餐食服务,您满不满意 (x) <categorical> 
## # total N=1058 valid N=1058 mean=3.42 sd=0.80
## 
## Value |      Label |   N | Raw % | Valid % | Cum. %
## ---------------------------------------------------
##     1 | 非常不满意 |  18 |  1.70 |    1.70 |   1.70
##     2 |   不太满意 | 103 |  9.74 |    9.74 |  11.44
##     3 |  一般/普通 | 411 | 38.85 |   38.85 |  50.28
##     4 |   还算满意 | 473 | 44.71 |   44.71 |  94.99
##     5 |   非常满意 |  53 |  5.01 |    5.01 | 100.00
##  <NA> |       <NA> |   0 |  0.00 |    <NA> |   <NA>

7 读取SPSS数据档

7.1 SPSS data(sjlabelled::read_spss)

要导入SPSS数据档(档名:stfoodEx.sav), 需先下载”sjlabelled”套件:install.packages(“sjlabelled”)(如果之前有下载过,就不用再下载了) 再调用”sjlabelled”套件: library(sjlabelled) 然后再透过函数:read_spss 将spss数据档汇入到R软件:stfoodEx.sav <- read_spss(“stfoodEx.sav”)

#下载"sjlabelled"套件
#install.packages("sjlabelled")
#调用"sjlabelled" 套件
library(sjlabelled)
#将SPSS数据汇入到R 
stfoodEx.sav<- read_spss("stfoodEx.sav")
## Converting atomic to factors. Please wait...
View(stfoodEx.sav)

另外一个将spss数据档导入R的方法,是使用”haven”套件的”read_sav”函数。

#下载"haven"套件
#install.packages("haven")
#调用"haven"套件
library(haven)
## 
## 载入程辑包:'haven'
## The following objects are masked from 'package:sjlabelled':
## 
##     as_factor, read_sas, read_spss, read_stata, write_sas, zap_labels
#将SPSS数据汇入到R 
stfoodEx.sav <- read_sav("stfoodEx.sav")
#检视数据
View(stfoodEx.sav)

7.2 查看R数据檔中的資料

我们可以使用”base”套件中的一些函数,来查看R数据档中的相关资讯。 可以使用”head()“函数,呈现使用中R数据资料档的前六笔资料; 或使用”tail()“函数,呈现后六笔资料。 使用”names()“函数,查看R数据料档中所有变量的变量名称。 使用”nrow()“函数,查看R数据料档中有几行(多少个案数)。 使用”ncol()“函数,查看R数据料档中有几列(多少个变量数)。 使用”dim()“函数,查看使用中的R数据资料档包含了几笔资料、几个变量。 使用”View()“函数,可以在RStudio开启另外一个小窗口,检视使用中数据所有的变量与个案。

#查看R数据檔中的資料
#看前六笔资料(head)
head(stfoodEx.sav)
## # A tibble: 6 × 31
##   Q1      Q2      Q3      Q5      Q7_1    Q7_2    Q7_3    Q7_4    Q7_5    Q7_6  
##   <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+>
## 1 2 [女]  2 [大… 4 [网… 3 [03.… 1 [yes] 0 [no]  1 [yes] 1 [yes] 0 [no]  0 [no]
## 2 1 [男]  2 [大… 4 [网… 3 [03.… 0 [no]  1 [yes] 1 [yes] 0 [no]  1 [yes] 0 [no]
## 3 2 [女]  3 [大… 3 [传… 4 [04.… 1 [yes] 0 [no]  0 [no]  1 [yes] 1 [yes] 0 [no]
## 4 2 [女]  2 [大… 4 [网… 2 [02.… 1 [yes] 0 [no]  1 [yes] 0 [no]  1 [yes] 0 [no]
## 5 1 [男]  2 [大… 4 [网… 4 [04.… 1 [yes] 1 [yes] 0 [no]  0 [no]  1 [yes] 0 [no]
## 6 2 [女]  2 [大… 4 [网… 5 [05.… 1 [yes] 1 [yes] 0 [no]  0 [no]  1 [yes] 0 [no]
## # … with 21 more variables: Q14 <dbl+lbl>, sex <dbl+lbl>, class2 <dbl+lbl>,
## #   dep4 <dbl+lbl>, f1 <dbl>, w1 <dbl>, f2 <dbl>, w2 <dbl>, f3 <dbl>, w3 <dbl>,
## #   f4 <dbl>, w4 <dbl>, f5 <dbl>, w5 <dbl>, f6 <dbl>, w6 <dbl>, w_adj <dbl>,
## #   w_rake1 <dbl>, w_rake2 <dbl>, w_rake3 <dbl>, w_rak_fin <dbl>
#看后六笔资料(tail)
tail(stfoodEx.sav)
## # A tibble: 6 × 31
##   Q1      Q2      Q3      Q5      Q7_1    Q7_2    Q7_3    Q7_4    Q7_5    Q7_6  
##   <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+l> <dbl+>
## 1 2 [女]  3 [大… 1 [新… 2 [02.… 1 [yes] 1 [yes] 0 [no]  0 [no]  0 [no]  0 [no]
## 2 2 [女]  3 [大… 1 [新… 3 [03.… 1 [yes] 0 [no]  1 [yes] 0 [no]  0 [no]  0 [no]
## 3 2 [女]  3 [大… 1 [新… 3 [03.… 1 [yes] 1 [yes] 0 [no]  0 [no]  1 [yes] 0 [no]
## 4 2 [女]  3 [大… 1 [新… 2 [02.… 1 [yes] 0 [no]  0 [no]  0 [no]  0 [no]  0 [no]
## 5 1 [男]  4 [大… 5 [数… 5 [05.… 1 [yes] 0 [no]  1 [yes] 1 [yes] 0 [no]  0 [no]
## 6 1 [男]  4 [大… 5 [数… 5 [05.… 0 [no]  1 [yes] 1 [yes] 1 [yes] 0 [no]  0 [no]
## # … with 21 more variables: Q14 <dbl+lbl>, sex <dbl+lbl>, class2 <dbl+lbl>,
## #   dep4 <dbl+lbl>, f1 <dbl>, w1 <dbl>, f2 <dbl>, w2 <dbl>, f3 <dbl>, w3 <dbl>,
## #   f4 <dbl>, w4 <dbl>, f5 <dbl>, w5 <dbl>, f6 <dbl>, w6 <dbl>, w_adj <dbl>,
## #   w_rake1 <dbl>, w_rake2 <dbl>, w_rake3 <dbl>, w_rak_fin <dbl>
#看数据档中所有的变量名称(names)
names(stfoodEx.sav)
##  [1] "Q1"        "Q2"        "Q3"        "Q5"        "Q7_1"      "Q7_2"     
##  [7] "Q7_3"      "Q7_4"      "Q7_5"      "Q7_6"      "Q14"       "sex"      
## [13] "class2"    "dep4"      "f1"        "w1"        "f2"        "w2"       
## [19] "f3"        "w3"        "f4"        "w4"        "f5"        "w5"       
## [25] "f6"        "w6"        "w_adj"     "w_rake1"   "w_rake2"   "w_rake3"  
## [31] "w_rak_fin"
#看有几行(nrow)
nrow(stfoodEx.sav) #1058 
## [1] 1058
#看有几列(ncol)
ncol(stfoodEx.sav) #31 
## [1] 31
#看数据档中包含了几笔资料,几个变量(dim)
dim(stfoodEx.sav) #1058  31
## [1] 1058   31
#检视数据(View)
View(stfoodEx.sav) 
#呈现编码簿与频数分布(原始未加权)
library(sjPlot)
view_df(stfoodEx.sav,   #指明R资料档的档案名称
        show.na = TRUE,  #呈现缺失值
        show.frq = TRUE, #呈现频数分布
        show.prc = TRUE) #呈现百分比
Data frame: stfoodEx.sav
ID Name Label missings Values Value Labels Freq. %
1 Q1 1.请问您的性别是? 0 (0.00%) 1
2

415
643
39.22
60.78
2 Q2
  1. 请问您是大几的学生?
0 (0.00%) 1
2
3
4
大一
大二
大三
大四
243
299
227
289
22.97
28.26
21.46
27.32
3 Q3
  1. 请问您目前就读的专业是什么?
0 (0.00%) 1
2
3
4
5
6
新闻学
编辑出版学
传播学
网络与新媒体
数字媒体艺术
数字媒体技术
166
223
288
135
215
31
15.69
21.08
27.22
12.76
20.32
2.93
4 Q5
  1. 平均来说,请问您一个月吃饭大概花多少钱?
0 (0.00%) 1
2
3
4
5
01.500以下
02.501-1000
03.1001-1500
04.1501-2000
05.2001以上
10
136
387
418
107
0.95
12.85
36.58
39.51
10.11
5 Q7_1 Q7_1.因为外卖节省排队时间 0 (0.00%) 0
1
no
yes
543
515
51.32
48.68
6 Q7_2 Q7_2.因为外卖选择多 0 (0.00%) 0
1
no
yes
573
485
54.16
45.84
7 Q7_3 Q7_3.因为食堂太挤 0 (0.00%) 0
1
no
yes
539
519
50.95
49.05
8 Q7_4 Q7_4.因为有时外卖有红包拿,便宜 0 (0.00%) 0
1
no
yes
609
449
57.56
42.44
9 Q7_5 Q7_5.因为想偶尔改变一下伙食 0 (0.00%) 0
1
no
yes
580
478
54.82
45.18
10 Q7_6 Q7_6.其他 0 (0.00%) 0
1
no
yes
881
177
83.27
16.73
11 Q14 14.总体来说,对于食堂所提供的餐食服务,您满不满意? 0 (0.00%) 1
2
3
4
5
非常不满意
不太满意
一般
还算满意
非常满意
18
103
411
473
53
1.70
9.74
38.85
44.71
5.01
12 sex 性别 0 (0.00%) 1
2

415
643
39.22
60.78
13 class2 年级 0 (0.00%) 1
2
大一+大二
大三+大四
542
516
51.23
48.77
14 dep4 学系 0 (0.00%) 1
2
3
4
新闻
传媒
设计
智能媒体
389
423
215
31
36.77
39.98
20.32
2.93
15 f1 0 (0.00%) range: 0.6-1.2
16 w1 0 (0.00%) range: 0.6-1.2
17 f2 0 (0.00%) range: 1.0-1.0
18 w2 0 (0.00%) range: 0.6-1.3
19 f3 0 (0.00%) range: 0.8-1.0
20 w3 0 (0.00%) range: 0.4-1.3
21 f4 0 (0.00%) range: 1.0-1.0
22 w4 0 (0.00%) range: 0.5-1.9
23 f5 0 (0.00%) range: 1.0-1.0
24 w5 0 (0.00%) range: 0.5-1.9
25 f6 0 (0.00%) range: 0.9-1.0
26 w6 0 (0.00%) range: 0.5-1.9
27 w_adj 0 (0.00%) range: 0.5-1.9
28 w_rake1 性别加权 0 (0.00%) range: 0.6-1.2
29 w_rake2 性别*年级加权 0 (0.00%) range: 0.6-1.3
30 w_rake3 性别年级学系加权 0 (0.00%) range: 0.5-1.9
31 w_rak_fin Raked Weight 0 (0.00%) range: 0.5-1.9

8 类别变量的频数分布

8.1 R 基本函数: table, prop.table

在设置完成变量标签与变量值标签之后,我们可以先做个变量的频数分布。 在R的基本函数中,可以使用”table()“函数,呈现变量的频数; 使用prop.table(table())函数,呈现变量各个数值的比例(百分比)。

table(stfoodEx.sav$Q14) #呈现频数
## 
##   1   2   3   4   5 
##  18 103 411 473  53
prop.table(table(stfoodEx.sav$Q1)) #呈现比例(百分比)
## 
##         1         2 
## 0.3922495 0.6077505

8.2 sjmisc::frq

我们可以进一步调用”sjmisc”套件的”frq”函数, 以呈现比较精美且符合学术要求的频数分布表。 “frq”函数有个选项”out”,如果都不设置,则频数分布结果会以纯文字形式 (txt)呈现在RStudio的Console视窗; 如果将out选项设置为out=“browser” or out= “b”, 则频数分布结果会以使用者预设的浏览器开启; 如果将out选项设置为out=“viewer” or out= “v”, 则频数分布结果会呈现在RStudio的Viewer视窗

#调用sjmisc套件
library(sjmisc)
#频数分布(frq)
#频数分布结果以纯文字形式呈现在RStudio的Console视窗
frq(stfoodEx.sav$Q14)
## 14.总体来说,对于食堂所提供的餐食服务,您满不满意? (x) <numeric> 
## # total N=1058 valid N=1058 mean=3.42 sd=0.80
## 
## Value |      Label |   N | Raw % | Valid % | Cum. %
## ---------------------------------------------------
##     1 | 非常不满意 |  18 |  1.70 |    1.70 |   1.70
##     2 |   不太满意 | 103 |  9.74 |    9.74 |  11.44
##     3 |       一般 | 411 | 38.85 |   38.85 |  50.28
##     4 |   还算满意 | 473 | 44.71 |   44.71 |  94.99
##     5 |   非常满意 |  53 |  5.01 |    5.01 | 100.00
##  <NA> |       <NA> |   0 |  0.00 |    <NA> |   <NA>
#频数分布结果以使用者预设的浏览器开启
frq(stfoodEx.sav$Q14, out = "browser")
14.总体来说,对于食堂所提供的餐食服务,您满不满意? (x) <numeric>
val label frq raw.prc valid.prc cum.prc
1 非常不满意 18 1.70 1.70 1.70
2 不太满意 103 9.74 9.74 11.44
3 一般 411 38.85 38.85 50.28
4 还算满意 473 44.71 44.71 94.99
5 非常满意 53 5.01 5.01 100.00
NA NA 0 0.00 NA NA
total N=1058 · valid N=1058 · x̄=3.42 · σ=0.80
#频数分布结果呈现在RStudio的Viewer视窗
frq(stfoodEx.sav$Q14, out = "viewer")
14.总体来说,对于食堂所提供的餐食服务,您满不满意? (x) <numeric>
val label frq raw.prc valid.prc cum.prc
1 非常不满意 18 1.70 1.70 1.70
2 不太满意 103 9.74 9.74 11.44
3 一般 411 38.85 38.85 50.28
4 还算满意 473 44.71 44.71 94.99
5 非常满意 53 5.01 5.01 100.00
NA NA 0 0.00 NA NA
total N=1058 · valid N=1058 · x̄=3.42 · σ=0.80
#升幂
frq(stfoodEx.sav$Q14, sort.frq=c("asc"),out="v") # html on Viewer 
14.总体来说,对于食堂所提供的餐食服务,您满不满意? (x) <numeric>
val label frq raw.prc valid.prc cum.prc
1 非常不满意 18 1.70 1.70 1.70
5 非常满意 53 5.01 5.01 6.71
2 不太满意 103 9.74 9.74 16.45
3 一般 411 38.85 38.85 55.29
4 还算满意 473 44.71 44.71 100.00
NA NA 0 0.00 NA NA
total N=1058 · valid N=1058 · x̄=3.42 · σ=0.80
#降幂
frq(stfoodEx.sav$Q14, sort.frq=c("desc"),out="v") # html on Viewer
14.总体来说,对于食堂所提供的餐食服务,您满不满意? (x) <numeric>
val label frq raw.prc valid.prc cum.prc
4 还算满意 473 44.71 44.71 44.71
3 一般 411 38.85 38.85 83.55
2 不太满意 103 9.74 9.74 93.29
5 非常满意 53 5.01 5.01 98.30
1 非常不满意 18 1.70 1.70 100.00
NA NA 0 0.00 NA NA
total N=1058 · valid N=1058 · x̄=3.42 · σ=0.80

以frq(…, out=“viewer”)所产生的频数分布表为例, “val”是value的缩写,数值代码之意。 “label”为变量标签之意。 “frq”是frequencies的缩写,频数之意。 “raw.prc”是raw percent的缩写,原始百分比之意(包含缺失值个案在内 的百分比)。 “valid.prc”是valid percent的缩写, 有效百分比之意(扣除缺失值个案后的百分比)。 “cum.prc”是cumulative percent的缩写,累积有效百分比之意。 “NA” 是Not Available的缩写,遗漏值或缺失值之意。

8.3 加权后频数分布sjmisc::frq(x, weights=)

要呈现加权后的频数分布,必须在sjmisc::frq后, 加上一个”weights=数据档名称$加权变量名称”。

#加权后频数分布
#讲义p.198 表11-10
library(sjmisc)
frq(stfoodEx.sav$Q14,weights=stfoodEx.sav$w_rak_fin) # plain text on console  
## 14.总体来说,对于食堂所提供的餐食服务,您满不满意? (xw) <numeric> 
## # total N=1058 valid N=1058 mean=3.42 sd=0.79
## 
## Value |      Label |   N | Raw % | Valid % | Cum. %
## ---------------------------------------------------
##     1 | 非常不满意 |  15 |  1.42 |    1.42 |   1.42
##     2 |   不太满意 | 104 |  9.83 |    9.83 |  11.25
##     3 |       一般 | 416 | 39.32 |   39.32 |  50.57
##     4 |   还算满意 | 472 | 44.61 |   44.61 |  95.18
##     5 |   非常满意 |  51 |  4.82 |    4.82 | 100.00
##  <NA> |       <NA> |   0 |  0.00 |    <NA> |   <NA>
frq(stfoodEx.sav$Q14, weights=stfoodEx.sav$w_rak_fin,out="v") # html on Viewer 
14.总体来说,对于食堂所提供的餐食服务,您满不满意? (xw) <numeric>
val label frq raw.prc valid.prc cum.prc
1 非常不满意 15 1.42 1.42 1.42
2 不太满意 104 9.83 9.83 11.25
3 一般 416 39.32 39.32 50.57
4 还算满意 472 44.61 44.61 95.18
5 非常满意 51 4.82 4.82 100.00
NA NA 0 0.00 NA NA
total N=1058 · valid N=1058 · x̄=3.42 · σ=0.79

对于spss数据资料而言,一般来说研究者通常会在SPSS中将各个变量(值)的 标签事先设置好,所以在汇入外部数据时,如果汇入的是SPSS数据, 则通常可以不用再在R环境去设置各个变量(值)的标签, 直接调用”sjmisc”套件的”frq”函数,就可以呈现带有标签说明的 频数分布表了。

8.4 呈现编码簿(未加权+加权)sjPlot::view_df(x,weight.by=)

在sjPlot::view_df后,增加一个”weight.by=加权变量名称”, 就可以呈现加权后频数分布的编码簿了。

#呈现编码簿与频数分布(未加权+加权)
library(sjPlot)
view_df(stfoodEx.sav,   #指明R资料档的档案名称
        weight.by = w_rak_fin, #设置加权变量
        show.na = TRUE,  #呈现缺失值
        show.frq = TRUE, #呈现频数分布
        show.prc = TRUE, #呈现百分比 
        show.wtd.frq=TRUE,#呈现加权频数分布
        show.wtd.prc=TRUE) #呈现加权百分比
Data frame: stfoodEx.sav
ID Name Label missings Values Value Labels Freq. % weighted Freq. weighted %
1 Q1 1.请问您的性别是? 0 (0.00%) 1
2

415
643
39.22
60.78
256
802
24.20
75.80
2 Q2
  1. 请问您是大几的学生?
0 (0.00%) 1
2
3
4
大一
大二
大三
大四
243
299
227
289
22.97
28.26
21.46
27.32
203
320
244
292
19.17
30.22
23.04
27.57
3 Q3
  1. 请问您目前就读的专业是什么?
0 (0.00%) 1
2
3
4
5
6
新闻学
编辑出版学
传播学
网络与新媒体
数字媒体艺术
数字媒体技术
166
223
288
135
215
31
15.69
21.08
27.22
12.76
20.32
2.93
135
187
282
132
295
26
12.77
17.69
26.68
12.49
27.91
2.46
4 Q5
  1. 平均来说,请问您一个月吃饭大概花多少钱?
0 (0.00%) 1
2
3
4
5
01.500以下
02.501-1000
03.1001-1500
04.1501-2000
05.2001以上
10
136
387
418
107
0.95
12.85
36.58
39.51
10.11
12
137
395
412
103
1.13
12.94
37.30
38.90
9.73
5 Q7_1 Q7_1.因为外卖节省排队时间 0 (0.00%) 0
1
no
yes
543
515
51.32
48.68
530
528
50.09
49.91
6 Q7_2 Q7_2.因为外卖选择多 0 (0.00%) 0
1
no
yes
573
485
54.16
45.84
573
485
54.16
45.84
7 Q7_3 Q7_3.因为食堂太挤 0 (0.00%) 0
1
no
yes
539
519
50.95
49.05
531
527
50.19
49.81
8 Q7_4 Q7_4.因为有时外卖有红包拿,便宜 0 (0.00%) 0
1
no
yes
609
449
57.56
42.44
609
449
57.56
42.44
9 Q7_5 Q7_5.因为想偶尔改变一下伙食 0 (0.00%) 0
1
no
yes
580
478
54.82
45.18
568
490
53.69
46.31
10 Q7_6 Q7_6.其他 0 (0.00%) 0
1
no
yes
881
177
83.27
16.73
866
192
81.85
18.15
11 Q14 14.总体来说,对于食堂所提供的餐食服务,您满不满意? 0 (0.00%) 1
2
3
4
5
非常不满意
不太满意
一般
还算满意
非常满意
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
12 sex 性别 0 (0.00%) 1
2

415
643
39.22
60.78
256
802
24.20
75.80
13 class2 年级 0 (0.00%) 1
2
大一+大二
大三+大四
542
516
51.23
48.77
523
535
49.43
50.57
14 dep4 学系 0 (0.00%) 1
2
3
4
新闻
传媒
设计
智能媒体
389
423
215
31
36.77
39.98
20.32
2.93
322
414
295
26
30.46
39.17
27.91
2.46
15 f1 0 (0.00%) range: 0.6-1.2
16 w1 0 (0.00%) range: 0.6-1.2
17 f2 0 (0.00%) range: 1.0-1.0
18 w2 0 (0.00%) range: 0.6-1.3
19 f3 0 (0.00%) range: 0.8-1.0
20 w3 0 (0.00%) range: 0.4-1.3
21 f4 0 (0.00%) range: 1.0-1.0
22 w4 0 (0.00%) range: 0.5-1.9
23 f5 0 (0.00%) range: 1.0-1.0
24 w5 0 (0.00%) range: 0.5-1.9
25 f6 0 (0.00%) range: 0.9-1.0
26 w6 0 (0.00%) range: 0.5-1.9
27 w_adj 0 (0.00%) range: 0.5-1.9
28 w_rake1 性别加权 0 (0.00%) range: 0.6-1.2
29 w_rake2 性别*年级加权 0 (0.00%) range: 0.6-1.3
30 w_rake3 性别年级学系加权 0 (0.00%) range: 0.5-1.9
31 w_rak_fin Raked Weight 0 (0.00%) range: 0.5-1.9

9 类别变量的多选题频数分布

多选题的频数分布,要先计算多选题中每一题的「总反应次数」, 以及「全部样本数」。 之后再制作一个数据框(data.frame)将各题反应次数、总反应次数、 以及总样本数等三项资讯,统合成三个变量。 然后再计算两种百分比:一是以「总反应次数」为分母的百分比: 另一是以「总样本数」为分母的百分比。 具体程序语法示例如下:

## 多选题
#呈现多选题各题的加权后次数分布
library(sjmisc)
frq(stfoodEx.sav, Q7_1:Q7_6, weights = stfoodEx.sav$w_rak_fin) #加权后
## Q7_1.因为外卖节省排队时间 (Q7_1) <numeric> 
## # total N=1058 valid N=1058 mean=0.50 sd=0.50
## 
## Value | Label |   N | Raw % | Valid % | Cum. %
## ----------------------------------------------
##     0 |    no | 530 | 50.09 |   50.09 |  50.09
##     1 |   yes | 528 | 49.91 |   49.91 | 100.00
##  <NA> |  <NA> |   0 |  0.00 |    <NA> |   <NA>
## 
## Q7_2.因为外卖选择多 (Q7_2) <numeric> 
## # total N=1058 valid N=1058 mean=0.46 sd=0.50
## 
## Value | Label |   N | Raw % | Valid % | Cum. %
## ----------------------------------------------
##     0 |    no | 573 | 54.16 |   54.16 |  54.16
##     1 |   yes | 485 | 45.84 |   45.84 | 100.00
##  <NA> |  <NA> |   0 |  0.00 |    <NA> |   <NA>
## 
## Q7_3.因为食堂太挤 (Q7_3) <numeric> 
## # total N=1058 valid N=1058 mean=0.50 sd=0.50
## 
## Value | Label |   N | Raw % | Valid % | Cum. %
## ----------------------------------------------
##     0 |    no | 531 | 50.19 |   50.19 |  50.19
##     1 |   yes | 527 | 49.81 |   49.81 | 100.00
##  <NA> |  <NA> |   0 |  0.00 |    <NA> |   <NA>
## 
## Q7_4.因为有时外卖有红包拿,便宜 (Q7_4) <numeric> 
## # total N=1058 valid N=1058 mean=0.42 sd=0.49
## 
## Value | Label |   N | Raw % | Valid % | Cum. %
## ----------------------------------------------
##     0 |    no | 609 | 57.56 |   57.56 |  57.56
##     1 |   yes | 449 | 42.44 |   42.44 | 100.00
##  <NA> |  <NA> |   0 |  0.00 |    <NA> |   <NA>
## 
## Q7_5.因为想偶尔改变一下伙食 (Q7_5) <numeric> 
## # total N=1058 valid N=1058 mean=0.46 sd=0.50
## 
## Value | Label |   N | Raw % | Valid % | Cum. %
## ----------------------------------------------
##     0 |    no | 568 | 53.69 |   53.69 |  53.69
##     1 |   yes | 490 | 46.31 |   46.31 | 100.00
##  <NA> |  <NA> |   0 |  0.00 |    <NA> |   <NA>
## 
## Q7_6.其他 (Q7_6) <numeric> 
## # total N=1058 valid N=1058 mean=0.18 sd=0.39
## 
## Value | Label |   N | Raw % | Valid % | Cum. %
## ----------------------------------------------
##     0 |    no | 866 | 81.85 |   81.85 |  81.85
##     1 |   yes | 192 | 18.15 |   18.15 | 100.00
##  <NA> |  <NA> |   0 |  0.00 |    <NA> |   <NA>
#计算总反应次数
528+485+527+449+490+192 #r=2671
## [1] 2671
#全部样本数n=1058

#制作数据框data frame
mydata<-data.frame(
  x1=c(528, 485, 527, 449, 490, 192),
  n=c(1058,1058,1058,1058,1058,1058),
  r=c(2671,2671,2671,2671,2671,2671)
)
View(mydata)

#制作新变量
#下载套件("dplyr")
#install.packages("dplyr")
#调用套件("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
#以加权反应次数2671為计算基础的百分比(总和=100%)
#函数"mutate",产生新变量
mydata.r<-mutate(mydata, percent.responses=(x1/r)*100)
mydata.r
##    x1    n    r percent.responses
## 1 528 1058 2671         19.767877
## 2 485 1058 2671         18.157993
## 3 527 1058 2671         19.730438
## 4 449 1058 2671         16.810183
## 5 490 1058 2671         18.345189
## 6 192 1058 2671          7.188319
#以加权后样本个案数1058為计算基础的百分比(总和不等于100%)
mydata.n<-mutate(mydata, percent.cases=(x1/n)*100)
mydata.n
##    x1    n    r percent.cases
## 1 528 1058 2671      49.90548
## 2 485 1058 2671      45.84121
## 3 527 1058 2671      49.81096
## 4 449 1058 2671      42.43856
## 5 490 1058 2671      46.31380
## 6 192 1058 2671      18.14745

10 样本代表性检验

## 未加权(原始数据)的样本代表性检stats::chisq.test(table())

调用”stats”套件的”chisq.test(table())“函数,并设置分析变量、 分析变量母体比例。 如果x-squared所对应的p值<0.05,则该样本变量不具代表性。

#未加权
#original data原始样本代表检定 for given probabilities: chisq.test
frq(stfoodEx.sav$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>
#library(stats)
#讲义p.197 表11-3~表11-5
chisq.test(table(stfoodEx.sav$sex),p = c(.242, .758)) #p.000
## 
##  Chi-squared test for given probabilities
## 
## data:  table(stfoodEx.sav$sex)
## X-squared = 130.2, df = 1, p-value < 2.2e-16
chisq.test(table(stfoodEx.sav$class2),p = c(.494, .506)) #p.0.2341
## 
##  Chi-squared test for given probabilities
## 
## data:  table(stfoodEx.sav$class2)
## X-squared = 1.4155, df = 1, p-value = 0.2341
chisq.test(table(stfoodEx.sav$dep4),p =  c(.305, .391, .279, .025)) #p.0.000
## 
##  Chi-squared test for given probabilities
## 
## data:  table(stfoodEx.sav$dep4)
## X-squared = 36.399, df = 3, p-value = 6.166e-08

## 加权后样本代表性检验sjstats::weighted_chisqtest()

调用”sjstats”套件的”weighted_chisqtest()“函数,并设置分析变量、加权变量、分析变量母体比例。 如果x-squared所对应的p>0.05,则该样本变量具代表性

#加权
#weighted data加权样本代表检定
#for given probabilities:weighted_chisqtest
#下载套件("sjstats")
#install.packages("sjstats")
#调用套件("sjstats")
library(sjstats)
#讲义p.198 表11-6~表11-8
weighted_chisqtest(sex ~w_rak_fin, stfoodEx.sav, p=c(.242, .758)) 
## 
## # Weighted chi-squared test for given probabilities
## 
##    Chi-squared: 0.0000
##             df: 1
##        p-value: > .999
##   Observations: 1058
weighted_chisqtest(class2 ~w_rak_fin, stfoodEx.sav,
                   p=c(.494, .506)) 
## 
## # Weighted chi-squared test for given probabilities
## 
##    Chi-squared: 0.0000
##             df: 1
##        p-value: > .999
##   Observations: 1058
weighted_chisqtest(dep4 ~w_rak_fin, stfoodEx.sav,
                   p=c(.305, .391, .279, .025)) 
## 
## # Weighted chi-squared test for given probabilities
## 
##    Chi-squared: 0.0024
##             df: 3
##        p-value: > .999
##   Observations: 1058

10.1 加权后频数分布sjmisc::frq(x,weights=)

调用”sjmisc”套件中的”frq”函数, 并加上”weights=数据档名称$加权变量名称”

#加权后频数分布(weights=)
library(sjmisc)
frq(stfoodEx.sav$sex,weights=stfoodEx.sav$w_rak_fin, out="v") 
性别 (xw) <numeric>
val label frq raw.prc valid.prc cum.prc
1 256 24.20 24.20 24.20
2 802 75.80 75.80 100.00
NA NA 0 0.00 NA NA
total N=1058 · valid N=1058 · x̄=1.76 · σ=0.43
# html on Viewer 
frq(stfoodEx.sav$class2,weights=stfoodEx.sav$w_rak_fin, out="v")
年级 (xw) <numeric>
val label frq raw.prc valid.prc cum.prc
1 大一+大二 523 49.43 49.43 49.43
2 大三+大四 535 50.57 50.57 100.00
NA NA 0 0.00 NA NA
total N=1058 · valid N=1058 · x̄=1.51 · σ=0.50
# html on Viewer 
frq(stfoodEx.sav$dep4,weights=stfoodEx.sav$w_rak_fin, out="v") 
学系 (xw) <numeric>
val label frq raw.prc valid.prc cum.prc
1 新闻 322 30.46 30.46 30.46
2 传媒 414 39.17 39.17 69.63
3 设计 295 27.91 27.91 97.54
4 智能媒体 26 2.46 2.46 100.00
NA NA 0 0.00 NA NA
total N=1057 · valid N=1057 · x̄=2.03 · σ=0.83
# html on Viewer 

#类别变量频数分布绘图 ## 条形图sjPlot::plot_frq(x,type=“bar”, weight.by=)

调用”sjPlot”套件中的”plot_frq”函数,并加上type=“bar”指令, 如果是要呈现加权后图形, 另外还要加上”weight.by=加权数据档名称$加权变量名称”

## 条形图 sjPlot::plot_frq(x,type=“bar”); sjPlot::plot_frq(x,type=“bar”, weight.by=)
library(sjPlot)
plot_frq(stfoodEx.sav$Q14,type="bar") #原始未加权

plot_frq(stfoodEx.sav$Q14,type="bar", 
         weight.by=stfoodEx.sav$w_rak_fin)#加权后(weight.by=)

10.2 饼图base::pie

## 饼图 base::pie(x)
table(stfoodEx.sav$Q14) #未加权
## 
##   1   2   3   4   5 
##  18 103 411 473  53
prop.table(table(stfoodEx.sav$Q14))#未加权
## 
##          1          2          3          4          5 
## 0.01701323 0.09735350 0.38846881 0.44706994 0.05009452
#加权后频数分布(weights=)
library(sjmisc)
frq(stfoodEx.sav$Q14, weights = stfoodEx.sav$w_rak_fin) #呈現频数分布(加权后)
## 14.总体来说,对于食堂所提供的餐食服务,您满不满意? (xw) <numeric> 
## # total N=1058 valid N=1058 mean=3.42 sd=0.79
## 
## Value |      Label |   N | Raw % | Valid % | Cum. %
## ---------------------------------------------------
##     1 | 非常不满意 |  15 |  1.42 |    1.42 |   1.42
##     2 |   不太满意 | 104 |  9.83 |    9.83 |  11.25
##     3 |       一般 | 416 | 39.32 |   39.32 |  50.57
##     4 |   还算满意 | 472 | 44.61 |   44.61 |  95.18
##     5 |   非常满意 |  51 |  4.82 |    4.82 | 100.00
##  <NA> |       <NA> |   0 |  0.00 |    <NA> |   <NA>
#產生一個向量变量:slice.pct, 并依次输入数据(百分比)
slice.pct <- c(1.42,9.83,39.32,44.61, 4.82)
#默认饼图(无标签)
pie(slice.pct) 

#自定义饼图(加上颜色设置及标签说明)
col_c = c(1:5) #使用系统预设的颜色1,颜色2,颜色3,颜色4,颜色5
pie(slice.pct, main = "Pie Chart 园饼图%", #加上标题
    labels = c("非常不满意 1.4%", "不太满意 9.8%", "一般 39.3%",
    "还算满意 44.6%", "非常满意 4.8%"),
    col = col_c) #加上颜色与说明的pie图

11 重新编码

调用”sjmisc”套件中的”rec”函数

#重新编码(sjmisc::rec)
#将原始变量(Q14)依照我们的编码规则(1:2=1; 3=2; 4:5=3),
#重新编码(rec)为另一新的变量(Q14r),并给予变量名称(var.label)
#和变量标签名称(val.labels)。
#将新的变量(Q14)设置为类别变量(as.num=FALSE)
library(sjmisc)
stfoodEx.sav$Q14r <- rec(stfoodEx.sav$Q14, 
                         rec =  "1:2=1; 3=2; 4:5=3" ,
                         var.label = "满意度三分类",
                         val.labels = c("不满意", "一般", "满意"),
                         as.num = FALSE
)

12 检查重新编码的正确性sjmisc::flat_table

library(sjmisc)
flat_table(stfoodEx.sav,Q14, Q14r)
##            Q14r 不满意 一般 满意
## Q14                             
## 非常不满意          18    0    0
## 不太满意           103    0    0
## 一般                 0  411    0
## 还算满意             0    0  473
## 非常满意             0    0   53

#将R记忆体中的档案,转存成R数据资料档(*.rda)

save(stfoodEx.sav, file = "stfoodEx.sav.rda")

##补充:RCPA3套件

#下载"RCPA3"套件
#install.packages("RCPA3")
#调用"RCPA3"套件
library(RCPA3)
#频次分布
#原始未加权
freqC(x = stfoodEx.sav$Q14) 
## ===========================================================================
##    Describing Distribution of Values with Frequency Table and Bar Chart
## ===========================================================================
## 
## 
## Table: Frequency Distribution of stfoodEx.sav$Q14 (14.总体来说,对于食堂所提供的餐食服务,您满不满意?)
## 
##          Frequency   Percent
## ------  ----------  --------
## 1               18      1.70
## 2              103      9.74
## 3              411     38.85
## 4              473     44.71
## 5               53      5.01
## Total         1058    100.00

#加权后  
freqC(x = stfoodEx.sav$Q14, w = stfoodEx.sav$w_rak_fin) 
## ===========================================================================
##    Describing Distribution of Values with Frequency Table and Bar Chart
## ===========================================================================
## 
## 
## Table: Frequency Distribution of stfoodEx.sav$Q14 (14.总体来说,对于食堂所提供的餐食服务,您满不满意?), Weighted by stfoodEx.sav$w_rak_fin
## 
##          Frequency   Percent
## ------  ----------  --------
## 1            14.83      1.40
## 2           104.16      9.85
## 3           416.20     39.34
## 4           472.28     44.64
## 5            50.54      4.78
## Total      1058.00    100.00

#加上标签
freqC(x = stfoodEx.sav$Q14, w = stfoodEx.sav$w_rak_fin,
      digits = 1,
      rowlabs = c("非常不满意","不太满意", "一般",
                  "满意","非常满意"),
      xlab = "Q14 整体而言,你对于你的生活满不满意",
      ylab = "百分比",
      main = "频数分布条形图(加权后)")
## ===========================================================================
##    Describing Distribution of Values with Frequency Table and Bar Chart
## ===========================================================================
## 
## 
## Table: Frequency Distribution of stfoodEx.sav$Q14 (14.总体来说,对于食堂所提供的餐食服务,您满不满意?), Weighted by stfoodEx.sav$w_rak_fin
## 
##               Frequency   Percent
## -----------  ----------  --------
## 非常不满意         14.8       1.4
## 不太满意          104.2       9.8
## 一般              416.2      39.3
## 满意              472.3      44.6
## 非常满意           50.5       4.8
## Total            1058.0     100.0

当我们的数据分析工作告一段落后,我们经常会使用”rm(list = ls())“这个函数,清除R记忆体中所有物件与资料, 以便在进行下次数据分析时,R的工作环境有个全新的开始。

rm(list = ls()) #清除记忆体中所有物件与资料     

13 本章小结

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

套件 函数 说明
base install.packages() 下载套件
library() 调用套件
class() 查看变量的属性
str() 查看变量的属性、分类数目
save() 将档案存成R数据资料档格式(*.rda)
load() 载入R数据资料档(*.rda)  
head() 查看R数据的前六笔资料
tail() 查看R数据的后六笔资料
names() 查看R数据中的所有变量
nrow() 查看R数据中有几行(多少个案数)  
ncol() 查看R数据中有几列(多少变量数)  
dim() 查看R数据中包含几笔资料,几个变量
names() 查看变量的名称
View() 在RStudio新开窗口,检视数据资料
table() 呈现变量的频数
prop.table() 呈现变量的频数比例(百分比)
data.frame() 制作包含变量与个案的数据框  
pie() 绘制基本的圆饼图       
rm(list=ls()) 去除R当前工作环境中所有的数据与物件
readxl read_excel() 将Excel格式数据资料档(*.xls)汇入到R
haven read_sav() 将SPSS格式数据资料档(*.sav)汇入到R
dplyr mutate() 制造新变量
stats chisq.test() 卡方适合度(样本代表性)检验
sjlabelled read_spss() 将SPSS格式数据资料档(*.sav)汇入到R
to_factor() 将变量设置为类别变量
to_numeric() 将变量设置为连续变量
set_label() 设置变量标签(variable label)
set_labels() 设置变量值标签(value label)
get_label() 查看变量标签
get_labels() 查看变量值标签
sjmisc frq() 呈现频数分布表
rec() 进行变量值的转换
flat_tab() 做两变量的交叉(检查变量转换是否正确)
sjstats weighted_chisqtest 加权后卡方适合度(样本代表性)检验
sjPlot view_df() 呈现R数据资料的编码簿