readr包进行数据导入(解析向量、解析文件、写入文件)

使用readr进行数据导入

readr 也是 tidyverse 的核心 R包之一

library(tidyverse)

1.2 入门

readr 的多数函数用于将平面文件转换为数据框。

read_csv() 读取逗号分隔文件、read_csv2() 读取分号分隔文件(这在用 , 表示小数位的国家非常普遍)、read_tsv() 读取制表符分隔文件、read_delim() 可以读取使用任意分隔符的文件。

read_csv("a,b,c

1,2,3

4,5,6")

 

read_csv() 函数都使用数据的第一行作为列名称,这是一种常见做法。

有时文件开头会有好几行元数据。你可以使用 skip = n 来跳过前 n 行;或者使用

comment = "#" 来丢弃所有以 # 开头的行:

read_csv("The first line of metadata

 The second line of metadata

 x,y,z

 1,2,3", skip = 2)

 

read_csv("# A comment I want to skip

 x,y,z

1,2,3", comment = "#")

 

数据没有列名称。可以使用 col_names = FALSE 来通知 read_csv() 不要将第一行作为列标题,而是将各列依次标注为 X1 Xn

read_csv("1,2,3\n4,5,6", col_names = FALSE)

 

可以向 col_names 传递一个字符向量,以用作列名称:

read_csv("1,2,3\n4,5,6", col_names = c("x", "y", "z"))

 

na 它设定使用哪个值(或哪些值)来表示文件中的缺失值:

read_csv("a,b,c\n1,2,.", na = ".")

 

1.2.1 与R基础包进行比较

readr 中的函数,一般来说,它们比基础模块中的函数速度更快(约快 10 倍)。

1.3 解析向量

parse_*() 函数族。这些函数接受一个字符向量,并返回一个特定向量,如逻辑、整数或日期向量:

str(parse_logical(c("TRUE", "FALSE", "NA")))

 

str(parse_integer(c("1", "2", "3")))

 

str(parse_date(c("2010-01-01", "1979-10-14")))

 

na 参数设定了哪些字符串应该当作缺失值来处理:

parse_integer(c("1", "231", ".", "456"), na = ".")

 

该使用 problems() 函数来获取完整的失败信息集合。这个函数会返回一个 tibble

problems(x)

1.3.1 数值类型

readr 使用了地区这一概念,这是可以按照不同地区设置解析选项的一个对象。通过创建一个

新的地区对象并设定 decimal_mark 参数,可以覆盖 . 的默认值:

parse_double("1.23")

 

parse_double("1,23", locale = locale(decimal_mark = ","))

 

parse_number() 解决了第二个问题:它可以忽略数值前后的非数值型字符。这个函数特别

适合处理货币和百分比,也可以提取嵌在文本中的数值:

parse_number("$100")

 

parse_number("20%")

 

parse_number("It cost $123.45")

 

1.3.2 字符串类型

R 中,我们可以使用 charToRaw() 函数获得一个字符串的底层表示:

charToRaw("Hadley")

 

每个十六进制数表示信息的一个字节:48 H61 a 等。

readr 全面支持 UTF-8:当读取数据时,它假设数据是 UTF-8 编码的,并总是使用 UTF-8

编码写入数据。

x1 <- "El Ni\xf1o was particularly bad this year"

x2 <- "\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd"

parse_character() 函数中设定编码方式:

parse_character(x1, locale = locale(encoding = "Latin1"))

 

parse_character(x2, locale = locale(encoding = "Shift-JIS"))

 

readr 提供了 guess_encoding() 函数来帮助你找出编码方式。

guess_encoding(charToRaw(x1))

 

guess_encoding(charToRaw(x2))

 

1.3.3 因子类型

名义型变量,有序型变量,连续型变量

因子,在R中名义型变量和有序型变量成为因子,factor,这些分类变量的可能值称为一个水平,level,例如good,better,best,都称为一个level。由这些水平值构成的向量就称为因子。

 

#这个语句可以显示出各个变量是什么意思

 

 

使用这个符号$取出某一列数据,cyl这一列可以作为因子类型

使用table()函数进行频数统计,这里的意思是分为三种类型(因子的level468):468;下面一行是对应的数量分别为11714

 

将向量转换为因子使用factor()函数

 

 

ordered=T 指定水平之间的顺序

生成一个因子

分别对向量和因子进行绘图

 

 

 

 

 

运用cut()函数进行有规律的分组,每隔10个,cut(num,c(seq(0,100,10)))

查看类型用class()函数

 

R 使用因子表示取值范围是已知集合的分类变量。要存在向量中没有的值,就会生成一条警告:

fruit <- c("apple", "banana")

parse_factor(c("apple", "banana", "bananana"), levels = fruit)

 

1.3.4 日期、日期时间与时间

parse_datetime() 期待的是符合 ISO 8601 标准的日期时间。ISO 8601 是一种国际标准,其中日期的各个部分按从大到小的顺序排列,即年、月、日、小时、分钟、秒:

parse_datetime("2010-10-01T2010")

 

# 如果时间被省略了,那么它就会被设置为午夜

parse_datetime("20101010")

 

parse_date() 期待的是四位数的年份、一个 - /、月、一个 - /,然后是日:

parse_date("2010-10-01")

 

parse_time() 期待的是小时、:、分钟、可选的 : 和秒,以及一个可选的 a.m./p.m. 标识符:

library(hms)

parse_time("01:10 am")

 

parse_time("20:10:01")

 

 

%Y4 位数);%y2 位数;00-69 → 2000-206970-99 → 1970-1999)。

%m2 位数);%b(简写名称,如 Jan;%B(完整名称,如 January)。

%d1 位或 2 位数);%e2 位数)

时间 %H0-23 小时);%I0-12 小时,必须和 %p 一起使用);%p(表示 a.m./p.m.;%M(分钟);%S(整数秒);%OS(实数秒)

非数值字符 %.(跳过一个非数值字符);%*(跳过所有非数值字符)。

1.4 解析文件

1.4.1 策略

readr 使用一种启发式过程来确定每列的类型,读取1000行,先使用 guess_parser() 函数返回 readr 最可信的猜测,接着 parse_guess() 函数使用这个猜测来解析列:

guess_parser("2010-10-01")

 

guess_parser("15:01")

 

guess_parser(c("TRUE", "FALSE"))

 

guess_parser(c("1", "5", "9"))

 

guess_parser(c("12,352,561"))

 

str(parse_guess("2010-10-10"))

 

 

逻辑值只包括 FTFALSE TRUE

整数只包括数值型字符(以及 -)。

双精度浮点数只包括有效的双精度浮点数(也包括 4.5e-5 这样的数值)。

数值只包括带有分组符号的有效双精度浮点数。

时间与默认的 time_format 匹配的值。

日期与默认的 date_format 匹配的值。

日期时间符合 ISO 8601 标准的任何日期

1.5 写入文件

readr 还提供了两个非常有用的函数,用于将数据写回到磁盘:write_csv() write_tsv()。如果想要将 CSV 文件导为 Excel 文件,可以使用 write_excel_csv() 函数,该函数会在文件开头写入一个特殊字符(字节顺序标记),告诉 Excel 这个文件使用的是 UTF-8 编码。

write_csv(challenge, "challenge.csv")

当保存为 CSV 文件时,类型信息就丢失了:

challenge

 

write_rds() read_rds() 函数是对基础函数 readRDS() saveRDS() 的统一包装。前

者可以将数据保存为 R 自定义的二进制格式,称为 RDS 格式:

write_rds(challenge, "challenge.rds")

read_rds("challenge.rds")

 

feather 包实现了一种快速二进制格式,可以在多个编程语言间共享:

library(feather)

write_feather(challenge, "challenge.feather")

read_feather("challenge.feather")

 

1.6 其他类型的数据

haven 可以读取 SPSSStata SAS 文件;readxl 可以读取 Excel 文件(.xls .xlsx 均可)。对于层次数据,可以使用 jsonlite(由 JeroenOoms 开发)读取 JSON 串,使用 xml2 读取

XML 文件。

posted @ 2021-11-19 15:07  zhang-X  阅读(754)  评论(0)    收藏  举报