readr的多数函数用于将平面文件转换为数据框。
1.read_csv:读取逗号分隔文件、read_csv2读取分号分隔的文件、read_tsv读取制表符分隔文件、read_delim读取使用任意分隔符的文件。
2.read_fwf读取固定宽度文件。既可以使用fwf_widths()函数按照宽度来设定域,也可以使用fwf_positions()函数按照位置来设定域。read_table读取空白符分隔各列的文件。
3.read_log读取Apache风格的日志文件。但要首先安装webreadr包。
下面重点介绍read_csv函数:
library(tidyverse)#加载readr包
heights<-read_csv('heights.csv')#第一个参数为文件路径
当运行read_csv函数时,会打印一份数据说明,给出每个列的名称和类型。
read_csv("a,b,c
1,2,3
4,5,6")
# A tibble: 2 x 3
a b c
1 1 2 3
2 4 5 6
以上情况都是自动将数据的第一行作为列名称,但是也有特殊情况:
1.文件开头会有好几行元数据。可以使用skip=n来跳过前面n行数据。或者使用comment="#"来丢弃所有以#开头的内容。
read_csv("The first line of my data
The second line of my data
x,y,z
1,2,3",skip=2)
# A tibble: 1 x 3
x y z
1 1 2 3
read_csv("#A comment
x,y,z
1,2,3",comment="#")
# A tibble: 1 x 3
x y z
1 1 2 3
2.数据没有列名
1)可以使用col_names=FALSE来告诉不要将第一行作为列名。而是将各列依次标注为X1...Xn
read_csv("1,2,3\n4,5,6",col_names = FALSE)
# A tibble: 2 x 3
X1 X2 X3
1 1 2 3
2 4 5 6
2)向col_names传递一个字符向量作为列名
read_csv("1,2,3\n4,5,6",col_names = c('a','b','c'))
# A tibble: 2 x 3
a b c
1 1 2 3
2 4 5 6
3)修改na参数以指定哪个值代表NA
read_csv("1,2,3\n4,5,.",na=".")
# A tibble: 1 x 3
`1` `2` `3`
1 4 5 NA
解析主要用到的函数是parse_*()函数族:
1.parse_logical、parse_integer函数分别用于解析逻辑值和整数。
2.parse_double是严格的数值型解析函数,parse_number是灵活的数值型解析函数。
3.parse_character:解析字符串
4.parse_factor函数可以创建因子,这种数据结构用来表示分类变量,该类变量具有固定数目的已知值。
5.parse_datetime、parse_date、parse_time可以解析不同类型的日期和时间。
下面将依次介绍这些函数:
1.数值
考虑到世界各地书写数值的方式不尽相同,readr设置了locale这个参数来表示“地区”这个概念。
parse_double("1,23",locale=locale(decimal_mark=","))#设置表示小数点的字符为逗号
考虑到数值前后经常会有各种符号,如:$100,10%...,parse_number函数可以忽略数值前后的非数值型字符。这个函数特别适合处理货币和百分比数据,也可以提取镶嵌在文本中的数值。
> parse_number("$100")
[1] 100
> parse_number("10%")
[1] 10
> parse_number("It costs me $10")
[1] 10
考虑到有些数值具有分组符号,而不同地区的分组规则不尽相同。我们组合使用parse_number和地区设置来解决这个问题:
> parse_number('$123,456,789')
[1] 123456789
> parse_number("123.456.789",locale=locale(grouping_mark = "."))
[1] 123456789
> parse_number("123'456'789",locale=locale(grouping_mark = "'"))
[1] 123456789
2.字符串
readr全面支持UTF-8编码格式,当读取数据时,其默认是该编码的。
可以通过设定encoding参数来改变编码方式:
parse_character(x1,locale=locale(encoding='Latin1'))
如果不知道编码方式,可以使用guess_encoding函数来找出编码方式:
charToRaw函数可以获取一个字符串的底层表示。
guess_encoding(charToRaw(x1))
guess_encoding()函数的第一个参数可以是一个文本路径,也可以是一个字符串。
3.因子
> fruit<-c("apple","banana")
> parse_factor(c("apple","banana"),levels=fruit)
[1] apple banana
Levels: apple banana
4.日期、日期时间与时间
1)parse_datetime期待的是符合ISO 8601标准的日期时间。该标准是一种国际标准,其中日期的各个部分按照从大到小的顺序排列,即年月日小时分钟秒。
> parse_datetime("2021-11-04T0927")
[1] "2021-11-04 09:27:00 UTC"
> parse_datetime("20211104")
[1] "2021-11-04 UTC"
2)parse_date期待的是四位数的年份[-或/]月[-或/]日
> parse_date("2021-11-04")
[1] "2021-11-04"
> parse_date("2021/11/04")
[1] "2021-11-04"
3)parse_time期待的是小时:分钟:秒 am/pm
> parse_time("09:27 am")
09:27:00
> parse_time("09:27 pm")
21:27:00
可以自己设置时间格式:
> parse_date("11/04/21","%m/%d/%y")
[1] "2021-11-04"
年:%Y(四位数);%y(两位数)
月:%m(两位数);%b(简写名称,如Jan);%B(完整名称,如January)
日:%d(一位或两位);%e(两位数)
时间:%H(0-23小时);%I(0-12小时,必须和%p一起使用);%p(表示am/pm);
%M(分钟);%S(整数秒);%0S(实数秒);%Z(时区);%z(与国际标准时间的时差);%.(跳过一个非数值的字符);%*(跳过所有非数值的字符)。
readr使用一种启发式过程来确定每一列的类型:先读取文件的前1000行,然后使用某种启发式算法确定每一列的类型。
这种过程存在两个问题:
1.前1000行只是一种特殊情况。
2.列中可能含有大量的缺失值,如果前1000行均为NA,readr可能猜测这是一个字符串向量。
可以使用一些通用方法来解决上述问题:
1.比默认方式再多检查一行:
challenge<-read_csv(readr_example("challenge.csv"),guess_max=1001)
readr_example函数可以找到包含在R包中函数的路径。
2.将所有列作为字符向量读入:
> challenge<-read_csv(readr_example("challenge.csv"),col_types = cols(.default=col_character()))
这种方式结合type_convert函数使用特别有效,后者可以在数据框的字符列上应用启发式解析过程:
注意:两种方式生成的数据框列的类型改变了。
> df<-tribble(
+ ~x,~y,
+ "1","1.21",
+ "2","2.21",
+ "3","3.21"
+ )
> df
# A tibble: 3 x 2
x y
1 1 1.21
2 2 2.21
3 3 3.21
> type_convert(df)
# A tibble: 3 x 2
x y
1 1 1.21
2 2 2.21
3 3 3.21
write_csv函数和write_tsv函数用于将数据写回磁盘。
1.用UTF-8对字符串进行编码。
2.使用ISO 8061格式保存日期和日期时间数据。
write_csv(challenge,"challenge.csv")
参数一为要保存的数据框,参数二为保存路径。
如果想要将csv数据保存为excel文件,可以使用write_excel_csv()函数。
haven:读取SPSS、Stata、SAS文件
readxl:读取Excel文件。
jsonlite:读取JSON串
xml2:读取XML文件