载入需要的程序包:showtext
载入需要的程序包:sysfonts
载入需要的程序包:showtextdb
载入需要的程序包:knitr
载入需要的程序包:readxl
载入需要的程序包:sjlabelled
载入需要的程序包:sjmisc
载入需要的程序包:sjPlot
载入需要的程序包:rio
本章学习者須先下载安装相關套件包,方能正常運行。
载入需要的程序包:showtext
载入需要的程序包:sysfonts
载入需要的程序包:showtextdb
载入需要的程序包:knitr
载入需要的程序包:readxl
载入需要的程序包:sjlabelled
载入需要的程序包:sjmisc
载入需要的程序包:sjPlot
载入需要的程序包:rio
我们通常会将R的工作环境先进行一些设置,这些设置包括了 “设定当前工作目录”、 “设定系統中文文字编码”、以及 “设定绘图物件中的中文文字” 等项。
[1] "/Users/simonfair/Desktop/量化研究数据分析/R Ch2 数据导入"
[1] "zh_CN.UTF-8/zh_CN.UTF-8/zh_CN.UTF-8/C/zh_CN.UTF-8/zh_CN.UTF-8"
在设置工作环境之后,现以一份简单的调查问卷为例,展示如何将问卷资料汇入到R环境,成为R数据档,以便进行后续的数据分析。
假设有一份问卷,包含下列一些题目,如图2-1。
假如研究者将受访者的回答数据,分别以 “CSV”, “Excel”, “Stata”, “SPSS”, 等不同数据的格式加以录入,哪我们如何将这些不同格式的外部数据,加以读取并汇入到R呢?以下分别说明。
先看一下CSV数据(stfood2019.csv)的格式示例,如图2-2。
接下来,我们将当前工作目录下的 “stfood2019.csv” 档案,透过 “read.csv( )” 函数,将数据汇入进R,将汇进来的档名命名为 “stfood2019CSV”,并使用 “head( )” 函数,呈现 “stfood2019CSV” 此一数据的前六笔资料。
Excel数据(stfood2019.xls)的外观如下,如图2-3。
接下来,我们将当前工作目录下的 “stfood2019.xls” 档案,透过 “readxl” 套件包的 “read_excel( )” 函数,将数据汇入进R,将汇进来的档名命名为 “stfood2019XLS”,并使用 “head( )” 函数,呈现 “stfood2019XLS” 此一数据前六笔资料。
Stata数据(stfood2019.dta)的外观如下,如图2-4。
接下来,我们将当前工作目录下的 “stfood2019.dta” 档案,透过 “sjlabelled” 套件包的 “read_stata( )” 函数,将数据汇入进R,将汇进来的档名命名为 “stfood2019DTA”,并使用 “head( )” 函数,呈现 “stfood2019DTA” 此一数据前六笔资料。
SPSS数据(stfood2019.sav)的外观如下,如图2-5。
接下来,我们将当前工作目录下的 “stfood2019.sav” 档案,透过 “sjlabelled” 套件包的 “read_spss( )” 函数,将数据汇入进R,将汇进来的档名命名为 “stfood2019SAV”,并使用 “head( )” 函数,呈现stfood2019SAV此一数据前六笔资料。
另外,我们也可以透过 “rio” 套件包的 “import( )” 函数,将不同类型的数据档,汇入到R中。
我们可以使用 “save( )” 函数,将从外部汇进来的档案,转存成R数据资料档(.rda 或 .RData)。
可以使用 “load( )” 函数,将R数据资料档(.rda 或.RData), 载入到RStudio的记忆体中。
R数据档被载入后, 可以使用 “head( )” 函数,呈现使用中R数据资料档的前六笔资料; 或使用 “tail( )” 函数,呈现后六笔资料。使用 “dim( )” 函数,查看使用中的R数据资料档包含了几笔资料、几个变量。使用 “names( )” 函数,查看R数据料档中所有变量的变量名称。使用 “View( )” 函数,可以在RStudio开启另外一个小窗口,检视使用中数据所有的变量与个案。
Q1 Q2 Q3 Q4 Q5
1 2 2 4 3 4
2 1 2 4 3 4
3 2 3 3 4 4
4 2 2 4 2 4
5 1 2 4 4 4
6 2 2 4 5 2
Q1 Q2 Q3 Q4 Q5
1053 2 3 1 2 4
1054 2 3 1 3 3
1055 2 3 1 3 4
1056 2 3 1 2 2
1057 1 4 5 5 4
1058 1 4 5 5 4
[1] 1058 5
[1] "Q1" "Q2" "Q3" "Q4" "Q5"
Q1 | Q2 | Q3 | Q4 | Q5 |
---|---|---|---|---|
2 | 2 | 4 | 3 | 4 |
1 | 2 | 4 | 3 | 4 |
2 | 3 | 3 | 4 | 4 |
2 | 2 | 4 | 2 | 4 |
1 | 2 | 4 | 4 | 4 |
2 | 2 | 4 | 5 | 2 |
变量(variable)一般可分为 “类别变量” (categorical variables)(定类变量、定序变量)与 “数字变量” (numeric variables)(定距变量、定比变量)两大属性。R对于变量的属性设置是很敏感的,关系到不同属性的变量会适用到各自不同的统计分析方法。因此,在进行数据分析之前,研究者需针对所欲分析的变量,进行变量属性的设置。
当数据被载入到R,如果没有做任何的设置,R会将数据中的各个变量默认为 “数字变量”。假如我们要将数据中的一些变量设置为 “类别变量”,则可加载 “sjlabelled” 套件的 “to_factor( )” 函数来完成这项工作。以stfood2019XLS此一数据而言,根据调查问卷的内容,我们可以知道,stfood2019XLS数据中的五个变量(Q1~Q5)都应该被当成 “类别变量” 来看待。具体语法例示如下:
可以透过 “class( )” 函数,查看变量的属性。如果显示 “factor” 代表该变量被设置为 “类别变量”,如果显示 “numeric” 代表该变量被设置为 “数字变量”。也可以使用 “str( )”函数,同时查看变量的属性(factor vs. numeric)、分成几类(levels)(如果是类别变量的话)、以及变量的前几笔资料。
从外部数据汇进R的档案(如CSV档案,Excel档案等)大部分都只有变量的数值代码,但没有变量的标签说明(variable label),也没有变量值的标签说明(value label)。 我们可以使用 “sjlabelled” 套件包的 “set_label( )” 函数,进行 “变量标签” 的设置;“set_labels( )”函数,进行 “变量值” 标签的设置。
#加载sjlabelled套件
library(sjlabelled)
#增加变量标签(set_label)与变量值标签(set_labels)
#Q1
stfood2019XLS$Q1 <- set_label(stfood2019XLS$Q1,
label = "Q1请问您的性别")
stfood2019XLS$Q1 <- set_labels(stfood2019XLS$Q1,
labels = c("男", "女"))
#Q1 (1:男 2:女)
#Q2
stfood2019XLS$Q2 <- set_label(stfood2019XLS$Q2,
label = "Q2请问您是大几的学生")
stfood2019XLS$Q2 <- set_labels(stfood2019XLS$Q2,
labels = c("大一", "大二", "大三", "大四"))
#Q2 (1:大一, 2:大二, 3:大三, 4:大四)
#Q3
stfood2019XLS$Q3 <- set_label(stfood2019XLS$Q3,
label = "Q3请问您目前就读的专业")
stfood2019XLS$Q3 <- set_labels(stfood2019XLS$Q3,
labels = c("新闻学",
"编辑出版学",
"传播学",
"网络与新媒体",
"数字媒体艺术",
"数字媒体技术"))
#Q3 (1:新闻学, 2:编辑出版学, 3:传播学,4:网络与新媒体, 5:数字媒体艺术, 6:数字媒体技术)
#Q4
stfood2019XLS$Q4 <- set_label(stfood2019XLS$Q4,
label = "Q4平均来说,请问您一个月吃饭大概花多少钱")
stfood2019XLS$Q4 <- set_labels(stfood2019XLS$Q4,
labels = c("500以下",
"501-1000",
"1001-1500",
"1501-2000",
"2001以上"))
#Q4 (1:500以下, 2:501-1000, 3:1001-1500, 4:1501-2000, 5:2001以上)
#Q5
stfood2019XLS$Q5 <- set_label(stfood2019XLS$Q5,
label = "Q5总体来说,对于食堂所提供的餐食服务,您满不满意")
stfood2019XLS$Q5 <- set_labels(stfood2019XLS$Q5,
labels = c("非常不满意",
"不太满意",
"一般/普通",
"还算满意",
"非常满意"))
#Q5 (1:非常不满意, 2:不太满意, 3:一般/普通, 4:还算满意, 5:非常满意)
可以透过 “sjlabelled” 套件包的 “get_label( )” 函数查看数据中每个 “变量” 的标签说明,“get_labels( )” 函数查看每个”变量值”的标签说明。
Q1
"Q1请问您的性别"
Q2
"Q2请问您是大几的学生"
Q3
"Q3请问您目前就读的专业"
Q4
"Q4平均来说,请问您一个月吃饭大概花多少钱"
Q5
"Q5总体来说,对于食堂所提供的餐食服务,您满不满意"
$Q1
[1] "男" "女"
$Q2
[1] "大一" "大二" "大三" "大四"
$Q3
[1] "新闻学" "编辑出版学" "传播学" "网络与新媒体" "数字媒体艺术"
[6] "数字媒体技术"
$Q4
[1] "500以下" "501-1000" "1001-1500" "1501-2000" "2001以上"
$Q5
[1] "非常不满意" "不太满意" "一般/普通" "还算满意" "非常满意"
在设置完成变量标签与变量值标签之后,我们就可以先做个变量的频数分布。在R的内建函数中,可以使用 “table( )” 函数,呈现变量的频数;使用 “prop.table(table( ))” 函数,呈现变量各个数值的比例(百分比)。
我们可以进一步使用 “sjmisc” 套件包的 “frq( )” 函数,以呈现比较精美且符合学术要求的频数分布表。“frq( )” 函数有个选项 “out”,如果都不设置,则频数分布结果会以纯文字形式(txt)呈现在RStudio的Console视窗; 如果将out选项设置为 out=“browser” or out= “b”,则频数分布结果会以使用者预设的浏览器开启; 如果将out选项设置为 out=“viewer” or out= “v”,则频数分布结果会呈现在RStudio的Viewer视窗
Q1请问您的性别 (x) <categorical>
# 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>
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(…,out=“viewer”)所产生的频数分布表为例,
“val” 是value的缩写,数值代码之意。
“label” 为变量标签之意。
“frq” 是frequencies的缩写,频数之意。
“raw.prc” 是raw percent的缩写,原始百分比之意(包含缺失值个案在内的百分比)。
“valid.prc” 是valid percent的缩写,有效百分比之意 (扣除缺失值个案后的百分比)。
“cum.prc” 是cumulative percent的缩写,累积有效百分比之意。
“NA” 是Not Available的缩写,遗漏值或缺失值之意。
在设置好变量标签与变量值标签后,我们就可以把数据资料档存档,以便日后直接提取时,就不需要再做一次变量标签与变量值标签设置的重复工作了。
Q5总体来说,对于食堂所提供的餐食服务,您满不满意 (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>
对于spss数据资料而言,一般来说研究者通常会在SPSS中将各个变量(值)的标签事先设置好,所以在汇入外部数据时,如果汇入的是SPSS数据,则通常可以不用再在R环境去设置各个变量(值)的标签,直接调用 “sjmisc” 套件包的 “frq( )” 函数,就可以呈现带有标签说明的频数分布表了。
SPSS数据档变量标签外观示例如下,如图2-7。
Converting atomic to factors. Please wait...
1.请问您的性别是? (Q1) <categorical>
# total N=1058 valid N=1058 mean=1.61 sd=0.49
Value | Label | N | Raw % | Valid % | Cum. %
----------------------------------------------
1 | 01.男 | 415 | 39.22 | 39.22 | 39.22
2 | 02.女 | 643 | 60.78 | 60.78 | 100.00
<NA> | <NA> | 0 | 0.00 | <NA> | <NA>
2. 请问您是大几的学生? (Q2) <categorical>
# total N=1058 valid N=1058 mean=2.53 sd=1.12
Value | Label | N | Raw % | Valid % | Cum. %
----------------------------------------------
1 | 大一 | 243 | 22.97 | 22.97 | 22.97
2 | 大二 | 299 | 28.26 | 28.26 | 51.23
3 | 大三 | 227 | 21.46 | 21.46 | 72.68
4 | 大四 | 289 | 27.32 | 27.32 | 100.00
<NA> | <NA> | 0 | 0.00 | <NA> | <NA>
3. 请问您目前就读的专业是什么? (Q3) <categorical>
# total N=1058 valid N=1058 mean=3.10 sd=1.43
Value | Label | N | Raw % | Valid % | Cum. %
--------------------------------------------------------
1 | 01.新闻学 | 166 | 15.69 | 15.69 | 15.69
2 | 02.编辑出版学 | 223 | 21.08 | 21.08 | 36.77
3 | 03.传播学 | 288 | 27.22 | 27.22 | 63.99
4 | 04.网络与新媒体 | 135 | 12.76 | 12.76 | 76.75
5 | 05.数字媒体艺术 | 215 | 20.32 | 20.32 | 97.07
6 | 06.数字媒体技术 | 31 | 2.93 | 2.93 | 100.00
<NA> | <NA> | 0 | 0.00 | <NA> | <NA>
5. 平均来说,请问您一个月吃饭大概花多少钱? (Q4) <categorical>
# total N=1058 valid N=1058 mean=3.45 sd=0.87
Value | Label | N | Raw % | Valid % | Cum. %
-----------------------------------------------------
1 | 01.500以下 | 10 | 0.95 | 0.95 | 0.95
2 | 02.501-1000 | 136 | 12.85 | 12.85 | 13.80
3 | 03.1001-1500 | 387 | 36.58 | 36.58 | 50.38
4 | 04.1501-2000 | 418 | 39.51 | 39.51 | 89.89
5 | 05.2001以上 | 107 | 10.11 | 10.11 | 100.00
<NA> | <NA> | 0 | 0.00 | <NA> | <NA>
14.总体来说,对于食堂所提供的餐食服务,您满不满意? (Q5) <categorical>
# total N=1058 valid N=1058 mean=3.42 sd=0.80
Value | Label | N | Raw % | Valid % | Cum. %
------------------------------------------------------
1 | 01.非常不满意 | 18 | 1.70 | 1.70 | 1.70
2 | 02.不太满意 | 103 | 9.74 | 9.74 | 11.44
3 | 03.一般/普通 | 411 | 38.85 | 38.85 | 50.28
4 | 04.还算满意 | 473 | 44.71 | 44.71 | 94.99
5 | 05.非常满意 | 53 | 5.01 | 5.01 | 100.00
<NA> | <NA> | 0 | 0.00 | <NA> | <NA>
我们可以调用 “sjPlot” 套件包的 “view_df( )” 函数,一次清楚呈现各个变量的名称(Names)、变量类型(Type)、变量标签(Variable Labels)、 变量值(Values)、变量值标签(Value Labels)、 频数分布(Freq)以及百分比(%)等相关资讯。这些资讯构成了我们常说的 “编码簿” (coding book)。
ID | Name | Type | Label | missings | Values | Value Labels | Freq. | % |
---|---|---|---|---|---|---|---|---|
1 | Q1 | categorical | 1.请问您的性别是? | 0 (0.00%) | 1 2 |
01.男 02.女 |
415 643 |
39.22 60.78 |
2 | Q2 | categorical | 2. 请问您是大几的学生? | 0 (0.00%) | 1 2 3 4 |
大一 大二 大三 大四 |
243 299 227 289 |
22.97 28.26 21.46 27.32 |
3 | Q3 | categorical | 3. 请问您目前就读的专业是什么? | 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 |
4 | Q4 | categorical | 5. 平均来说,请问您一个月吃饭大概花多少钱? | 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 | Q5 | categorical | 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 |
当我们的数据分析工作告一段落后,我们经常会使用 “rm(list =ls( ))” 这个函数,清除R记忆体中所有物件与资料,以便在进行下次数据分析时,R的工作环境有个全新的开始。
本章所使用到的R套件包与函数,摘录如下表。
套件包 | 函数 | 说明 |
---|---|---|
内建 | setwd ( ) | 设置当前工作目錄 |
getwd ( ) | 显示当前工作目錄 | |
install.packages ( ) | 安装套件包 | |
library ( ) | 加载套件包 | |
read.csv ( ) | 将CSV格式数据资料档汇入到R | |
save ( ) | 将档案存成R数据资料档格式(*.rda) | |
load ( ) | 载入R数据资料档(*.rda) | |
head ( ) | 查看R数据的前六笔资料 | |
tail ( ) | 查看R数据的后六笔资料 | |
dim ( ) | 查看R数据中包含几笔资料,几个变量 | |
names ( ) | 查看变量的名称 | |
View ( ) | 在RStudio新开窗口,检视数据资料 | |
class ( ) | 查看变量的属性 | |
str ( ) | 查看变量的属性及分类数目 | |
table ( ) | 呈现变量的频数 | |
prop.table ( ) | 呈现变量的频数比例(百分比) | |
rm (list=ls( )) | 去除R当前工作环境中所有的数据与物件 | |
readxl | read_excel ( ) | 将Excel格式数据资料档(*.xls)汇入到R |
sjlabelled | read_spss ( ) | 将SPSS格式数据资料档(*.sav)汇入到R |
read_stata ( ) | 将Stata格式数据资料档(*.dta)汇入到R | |
to_factor ( ) | 将变量设置为类别变量 | |
to_numeric ( ) | 将变量设置为数字变量 | |
set_label ( ) | 设置变量标签(variable label) | |
set_labels ( ) | 设置变量值标签(value label) | |
get_label ( ) | 查看变量标签 | |
get_labels ( ) | 查看变量值标签 | |
sjmisc | frq ( ) | 呈现频数分布表 |
sjPlot | view_df ( ) | 呈现R数据资料的编码簿 |
rio | import ( ) | 将不同类型的数据档(CSV,Escel,SPSS, |
Stata,SAS…)汇入到R |