4 第三讲:如何导入数据

4.1 路径与工作目录

那么什么是工作目录呢?简单来说,工作目录就是R会在其中寻找文件的文件夹。如果你没有指定工作目录,那么R会默认使用你的用户文件夹作为工作目录。但是,如果你的数据文件不在用户文件夹中,那么你需要告诉R去哪里找这些文件。这就是为什么我们需要设置工作目录的原因。我们可以使用“get.wd”命令来查看当前的工作目录。当我们打开一个R项目时,它会自动打开项目所在的目录。

4.1.1 相对路径与绝对路径

建议为每一个数据分析项目设立一个文件夹,并且在其中创建一个R项目。这样,每次打开项目时,它都会自动打开所在的位置。在讲解路径和工作目录的概念时,我们需要先了解两个概念:绝对路径相对路径。绝对路径指的是文件或文件夹在硬盘上的真实路径,而相对路径则是指相对于当前路径的位置。例如,在chapter3文件夹中,data文件夹的相对路径为./data。相对路径的好处在于,当我们复制整个文件夹时,相对路径的位置不会改变。相对路径是相对于当前路径的位置,而绝对路径则是相对于硬盘的起始位置。

如果我们有一个子文件夹叫做data,那么它就是当前文件夹的子文件夹,也可以称为子目录,而当前文件夹则是它的父文件夹,也可以称为父目录。如果我们复制这个文件夹到另一个电脑上,它们之间的相对关系不会改变,但如果我们把它从D盘复制到E盘,那么绝对路径就会改变,相对路径仍然保持不变。因此,我们建议把所有文件都放在一个文件夹中,这样所有文件的相对路径都是相对于这个文件夹的,方便编写代码。如果文件夹放在不同的位置,每次引用或查找文件时都需要使用绝对路径,非常麻烦。

在Windows系统中,每个磁盘都有自己的盘符,例如C、D、E、F盘。绝对路径是从盘符开始一直写到当前文件夹,对于Mac和Linux系统,它们只有一个根目录,没有盘符的概念。我们最常用的是“用户”,比如我的用户名,然后有一个“主目录”,这就是用户的文件夹。当我们使用苹果系统或者Linux系统时,基本上很多时候都是基于这个“用户”文件夹或者“users.html4c”进行操作。除了“主目录”以外,它可能还有一个“下载”,就是你下载的文件都放在哪里,还可能有一个“图片”,就是你的各种图等等。所以它就是在一个文件夹下面有不同的子文件夹,比如有“etc”、“用户”还有其他的“根目录”等等。我们主要就是基于“用户”,然后建立自己的一系列的文件。在Windows中,它可以分成三个盘,每个区都是自己的盘符,然后基于这个盘符你又可以重新定义一个新的路径。这就相当于路径的定义不太一样。我们刚刚也讲了相对路径和绝对路径。如果我们所有的分析都放在一起的话,那么我们用相对路径是更好的。就像我们写代码的时候,不要把C盘D盘什么这些一整串写进来,因为写进来之后你换一个电脑,这个C盘它就不是C盘了,它可能是变成D盘了,或者你换到苹果上面之后,它可能就没有C盘了,它就是“用户”开头了。

4.1.2 Here包的使用

介绍一个常用的包,包名叫做Here。Here这个包可以帮助你很快地去定位你的当前的新的目录。打开了这个,就能够迅速地看到我自己在哪。它另外一个好处就是我们能够不用考虑我的系统是什么,然后我就直接能够把它的一系列文件夹都调出来。

我们的Windows系统中的地址栏和R中的地址栏斜线方向不同。如果我们直接复制Windows地址栏的地址作为绝对路径,可能会出现错误。为了避免手动拼接路径出错,我们可以使用here函数来自动补全路径。这个函数会自动将当前文件夹的路径补全,我们只需要在路径中加入文件夹名即可。例如,我们可以使用here(“data”, “match”)来获取data文件夹下的match文件。这个小技巧可以帮助我们避免一些错误,特别是在不同电脑之间切换时。

4.2 读取数据

工作目录是R与我们的硬盘交互的接口,我们可以使用getwd()函数来获取当前工作目录的绝对路径。我们可以使用相对路径来引用子文件夹的位置。接下来我想要查看数据的相对路径和绝对路径。假设我们的工作目录是在桌面上,数据存储在”data”文件夹中,其中包含两个子文件夹,一个是”match”,包含178个文件,另一个是”pengiun”,只有一个文件。相对路径中的一个点(.)代表当前文件夹,数据在”data”文件夹中,“match”文件夹下有178个文件。如果我们要读取某个文件,必须完整地写出文件名。对于”pengiun”文件夹,它的相对路径是”./data/pengiun”

4.2.1 read.csv函数

现在我们知道了数据的相对路径,可以使用”read.csv”函数来读取数据。我们需要给数据一个名称,例如”pengiun.data”,并使用”read.csv”函数来读取数据。在函数中,我们需要指定相对路径。这里建议使用相对路径而不是绝对路径,因为绝对路径需要每次更改代码。

“head = TRUE”是函数中的一个参数,用于指定文件是否包含列名。如果文件的第一行是列名,则将其设置为”TRUE”,否则为”FALSE”。在R语言中,假用false表示,真用true表示。读取这样的txt文件时,需要使用分隔符来分隔不同列的数据。为了更直观地了解这个过程,我们可以打开csv文件。虽然这是一个csv文件,但我们也可以使用txt打开,如果我们使用文本编辑器打开,数据看起来会很混乱,因为它包含换行符。

当使用函数读取时,行是自动识别的来识别的,而列必须使用分隔符来识别。在这里,我们使用逗号作为分隔符。这样,我们就可以将数据读取为行和列。我们可以使用data table包来方便地展示读取后的数据。为了方便在PPT中展示数据,我们可以使用head函数来大致的查看数据。我们已经读取了数据,按照逗号分隔后,第一行是列名,我们可以将其识别为表头。从第二行开始是数据,第一个列的第一个值是1975,后面是1995等等。这是一个问卷数据,每个编号代表一个问卷和其items。我们可以用不同的方式对其进行编号,比如uncertainty等等。

对于常用的数据文件,我们可以使用here来定义相对路径,然后使用import来读取数据。读取后,我们可以看到有247个变量。对于.out文件,我们可以使用read.csv来读取,但是需要将separator参数设置为斜杠加t,表示以tab为分隔符。在进行统计分析时,我们需要明确定义用于分割数据的符号。除了逗号和tab键,还可以使用分号、空格或分行符等多种方式。

read.csv是最常用的数据读取函数,但实际上它是read.table的一个特殊形式。因此,我们也可以使用read.table来读取数据。但是,由于.out文件是我们自定义的一个txt文件,无法使用bruce-r的import函数进行导入。这种情况很常见,你需要清楚你的数据结构,包括分隔符和编写模式,以便正确读取数据。

完成这些操作后,R中的环境environment应该发生了变化。在右上角的环境中,我们可以看到两个相应的数据match data和PenguinData。PenguinData是一个符号,我们可以用任何其他符合命名规则的名称来代替它,比如abcd,比如xyz。这里存储了一些可操作和创建的对象,我们称之为R对象。现在我们导入的对象的种类被称之为数据框,有关数据框的知识将在之后讲到。

4.2.2 命名

在命名时,应尽量简短,避免使用中文。如果发现文件目录没有问题,但仍然出现错误,有两种可能性。一种是拼写错误,例如拼写单词penguin时少了一个字母或交换了两个字母的位置。另一种可能是文件夹的大小写不匹配,例如使用大写字母开头的文件夹,但在输入路径时使用小写字母。在这种情况下,我们需要仔细检查并逐行对比当前工作目录和文件夹的实际目录是否匹配。最有效的方法是直接点击文件的属性,查看其目录和名称是否与输入的完全相同。

4.3 了解R里的数据 (R语言中的对象)

data structure
data structure

R语言中的几个常用对象包括:向量、矩阵、数组、数据框和列表。其中,向量是一列数字或其他相同类型的元素,而矩阵是一个二维的数据结构,有长和宽,可以看作是将向量按行排列而成的。数组是在矩阵的基础上再往上拓展,变成了一个三维的数据结构。

在R语言中,我们更多地使用数据框,它看起来像矩阵,但每个列可以是不同类型的元素。而列表则更加复杂,每个元素都可以是不同类型的对象。这些对象在编程软件中非常常用,比如Python和Matlab。

我们没有时间讲解数据框,但是我们已经解决了读取数据的问题。我们下节课再深入讲解这些知识。在下节课之前,大家可以查看王敏杰老师和张金星老师的两本书,这些书将更清楚地介绍这些基础知识。