参考资料:
Data Analysis and Prediction Algorithms with R
我们之前使用的数据都是R语言内存储好的数据集,然而在实际应用时,我们需要从外部数据库、相关数据文件导入。目前,最常见的存储数据方式之一是通过电子表格。电子表格按行和列存储数据。它是数据框的文件版本。将这样的表保存到计算机文件时,需要定义列和值。
当使用文本文件创建电子表格时,就像使用简单的文本编辑器创建的电子表格一样,换行符表示新的一行,列用一些特殊的分隔符分开,例如,;空格等
在定义数据表时,要注意第一行包含列名,而不是数据。我们称之为标题,当我们从电子表格中读取数据时,重要的是要知道文件是否有标题。大多数读取函数都假设数据集有一个标题。要知道文件是否有表头,在读取之前先查看文件。但是不是所有的电子表格文件都是文本形式的,例如excel,csv等。本章将如何介绍这些数据的导入
# 导入相关库
library(tidyverse)
导入数据的第一步就是要知道数据存储的路径,也就是在哪个文件夹,这里我们看一下如何分析R内部数据的路径和工作目录
包含美国谋杀案数据的电子表格是dslabs软件包的一部分。下面几行代码将该文件复制到默认情况下R查找的文件夹中。
filename <- "murders.csv"
dir <- system.file("extdata", package = "dslabs")
fullpath <- file.path(dir, filename)
file.copy(fullpath, "murders.csv")
FALSE
上述代码复制了一个文件。‘murders.csv’,我们可以使用read_csv读取他
dat<-read_csv(filename)
Rows: 51 Columns: 5
-- Column specification ------------------------------------------------------------------------------------------------
Delimiter: ","
chr (3): state, abb, region
dbl (2): population, total
i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
您可以将计算机的文件系统视为一系列嵌套的文件夹,每个文件夹包含其他文件夹和文件。我们将包含所有其他文件夹的文件夹称为根目录。我们将当前所在的目录称为工作目录。因此,在文件夹中移动时,工作目录会发生变化:将其视为当前位置。
文件路径是一个目录列表名,可以将其视为关于单击哪些文件夹以及按什么顺序查找文件的说明。如果这些说明是为了从根目录中查找文件,我们将其称为绝对路径。如果说明是从工作目录开始查找文件,我们将其称为相对路径。
下面来看一下绝对路径
system.file(package = 'dslabs')
‘C:/Users/DELL/Documents/R/win-library/4.0/dslabs’
用斜线分隔的字符串是目录名。第一个斜杠代表根目录,我们知道这是一个绝对路径,因为它以斜杠开头。如果第一个目录名前面没有斜杠,则路径是相对的。我们可以使用函数list.files以查看相对路径的示例。
dir <- system.file(package = 'dslabs')
list.files(path = dir)
如果我们使用绝对路径,这些相对路径给出了最后的位置。例如'data'
的绝对路径就是:
'C:/Users/DELL/Documents/R/win-library/4.0/dslabs/data'
我建议大家在代码中最好使用相对路径。因为绝对路径是唯一的,并且我们希望代码是可移植的。通过使用getwd函数,可以获得工作目录的完整路径。
wd <- getwd()
wd
‘C:/Users/DELL/r语言学习/数据科学导论:基于R’
另一个获得绝对路径但是不需要写出全部路径的方法是使用file.path
filename <- 'murders.csv'
dir <- system.file('extdata',package='dslabs')
fullpath <- file.path(dir,filename)#file.path的左右是把两个文件连接在一起得到组合的路径
fullpath
‘C:/Users/DELL/Documents/R/win-library/4.0/dslabs/extdata/murders.csv’
system.file
给出了文件夹的绝对路径,其中包含了package参数。通过浏览dir中的列表文件,我们可以发现extdata中有我们想要的murders文件
filename %in% list.files(file.path(dir)) # 查看filename是否在extdata中
TRUE
file.copy()
此函数接受两个参数:要复制的文件和在新目录中为其指定的名称。
file.copy(fullpath, "murders.csv")
FALSE
在本节中,我们主要讨论tidyverse数据导入功能。利用murders数据集。以dslabs包提供的csv文件为例。
filename <- "murders.csv"
dir <- system.file("extdata", package = "dslabs")
fullpath <- file.path(dir, filename)
file.copy(fullpath, "murders.csv")
FALSE
readr库包含将文本文件电子表格中存储的数据读取到R中的功能。readr是tidyverse软件包的一部分,也可以直接加载:
library(readr)
Function Format 后缀
read_table 空格分隔 txt
read_csv 逗号分隔 csv
read_csv2 分号分隔 csv
read_tsv 制表符分隔 tsv
read_delim 通用文本格式,要指定分隔符 txt
虽然后缀通常告诉我们它是什么类型的文件,但不能保证它们总是匹配的。我们可以打开文件查看,也可以使用函数read_lines查看几行
read_lines('murders.csv',n_max=3)
同时可以看出数据有一个标题。现在我们使用read_csv读取:
dat <- read_csv(filename)
Rows: 51 Columns: 5
-- Column specification ------------------------------------------------------------------------------------------------
Delimiter: ","
chr (3): state, abb, region
dbl (2): population, total
i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.
head(dat)
state | abb | region | population | total |
---|---|---|---|---|
Alabama | AL | South | 4779736 | 135 |
Alaska | AK | West | 710231 | 19 |
Arizona | AZ | West | 6392017 | 232 |
Arkansas | AR | South | 2915918 | 93 |
California | CA | West | 37253956 | 1257 |
Colorado | CO | West | 5029196 | 65 |
library(readxl)
主要有以下几个函数:
Function Format 后缀
read_excel auto detect the format xls, xlsx
read_xls original format xls
read_xlsx new format xlsx
Microsoft Excel格式允许在一个文件中包含多个电子表格。这些被称为sheet。上面列出的函数默认读取第一页,但我们也可以读取其他的。excel_sheets函数为我们提供excel文件中所有工作表的名称。然后,可以将这些名称传递给上述三个函数中的sheet参数,以读取除第一个以外的工作表。
另一个常见的数据互联网数据。当这些数据存在文件中时,我们可以下载它们,然后导入它们,甚至可以直接从网络上读取它们。例如,dslab包位于GitHub上,所以我们随包下载的文件有一个url:
url <- "https://raw.githubusercontent.com/rafalab/dslabs/master/inst/
extdata/murders.csv"
dat <- read_csv(url)
Rows: 1 Columns: 1
-- Column specification ------------------------------------------------------------------------------------------------
Delimiter: ","
chr (1): https://raw.githubusercontent.com/rafalab/dslabs/master/inst/
i Use `spec()` to retrieve the full column specification for this data.
i Specify the column types or set `show_col_types = FALSE` to quiet this message.