R数据科学-第5章使用readr进行数据导入

一、入门

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文件

你可能感兴趣的:(r语言,开发语言,数据分析)