R数据科学读书会数据-R语言-图表-决策-Linux-Python

小洁详解《R数据科学》--第八章 readr

2018-10-18  本文已影响126人  小洁忘了怎么分身

啊啊啊。迟到了。这周会再补上一篇的!最近事情多,脑子乱糟糟。为了文章现学了分子对接,还参加了一次周末培训,知识量猛增,但这本神书学R,绝不能停!

1.准备工作

library(tidyverse)

2.read.csv

read_csv()#逗号分隔
read_csv2() #分号分隔
read_tsv()#制表符分隔
read_delim()#任意分隔符 read_delim(file,delim='')

read_fwf()#固定宽度文件,不熟悉,但知道read_table()是他的变体。

read_csv()的参数

1.可以使用skip = n 来跳过前n 行;
2.用comment = "#" 来丢弃所有以# 开头的行
3.默认第一行为列名,取消默认用col_names = FALSE,定义列名向col_names传递一个字符向量。
4.将某些值读取为缺失值,na="."

read_csv("The first line of metadata
The second line of metadata
x,y,z
1,2,3", skip = 2)

练习
(1) 如果一个文件中的域是由“|”分隔的,那么应该使用哪个函数来读取这个文件?
read_delim(file, delim = "|")
(2) 除了file、skip 和comment,还有哪些参数是read_csv() 和read_tsv() 这两个函数共
有的?
union(names(formals(read_csv)), names(formals(read_tsv)))
(3) read_fwf() 函数中最重要的参数是什么?
read_fwf()读取“固定宽度格式” 的最重要的参数是col_positions告诉函数数据列开始和结束的位置。
(4) 有时CSV 文件中的字符串会包含逗号。为了防止引发问题,需要用引号(如" 或')将逗号围起来。按照惯例,read_csv() 默认引号为",如果想要改变默认值,就要转而使用read_delim() 函数。要想将以下文本读入一个数据框,需要设定哪些参数?
"x,y\n1,'a,b'"
x <- "x,y\n1,'a,b'"
read_csv(x, quote = "'")
(5) 找出以下每个行内CSV 文件中的错误。如果运行代码,会发生什么情况?
read_csv("a,b\n1,2,3\n4,5,6")
问题:第一行只有两个数值,二、三行却有3个。第一行默认为列名,所以是定义了两列,第二、三行的第三个数就是多余的列,默认被删掉了。
read_csv("a,b,c\n1,2\n1,2,3,4")
每行的元素个数不一样,以列名为基准,多余的被删除,缺少的为NA。
read_csv("a,b\n\"1")
1前面的“”只有一半,被删除掉了。这个运行结果等同于read_csv("a,b\n1")
read_csv("a,b\n1,2\na,b")
这个有问题吗?
read_csv("a;b\n1;3")
分隔符是“;”应用read_csv2()读取

3.解析向量

parse_*() 函数接受一个字符型向量,并返回一个特定向量,如逻辑、整数或日期,改变了数据类型。

parse_logical()
parse_integer()
parse_double()
parse_number()
parse_character()
parse_factor()
parse_datetime()、parse_date() 和parse_time()

解析失败可用problems(x)获取失败信息集合,可用dplyr处理缺失值。

3.1.数值

默认小数点是"."有的国家用逗号作为小数点,需要用参数locale = locale(decimal_mark = ",")设置。

parse_double("1.23")
#> [1] 1.23
parse_double("1,23", locale = locale(decimal_mark = ","))
#> [1] 1.23

数字前后有货币、百分比、无关文本等等,可用parse_number提取。

3.2字符串

parse_character()
用charToRaw()获得一个字符串的底层编码。
处理数据文本乱码,可以用locale = locale(encoding = "")
猜测编码方式:guess_encoding(charToRaw())

3.3因子

fruit <- c("apple", "banana","bananana")
parse_factor(c("apple", "banana", "bananana"), levels = fruit)
#[1] apple    banana   bananana
#Levels: apple banana bananana

3.4日期

此部分跳过,和生信好像没有关系。

3.5练习

(1) locale() 函数中最重要的参数是什么?
数字:指定小数点符号和分组符号decimal_mark,grouping_mark
编码方式:encoding
(2) 如果将decimal_mark 和grouping_mark 设为同一个字符,会发生什么情况?如果将decimal_mark 设为,,grouping_mark 的默认值会发生什么变化?如果将grouping_mark 设为.,decimal_mark 的默认值会发生什么变化?
相同则报错。小数点设为逗号,则分组符号默认改为"."
(5) read_csv() 和read_csv2() 之间的区别是什么?
分隔符, read_csv() 是逗号,read_csv2()是分号

4.解析文件

guess_parser() 猜测数据类型
parse_guess() 解析列,列是向量。

challenge <- read_csv(readr_example("challenge.csv"))

自动根据前1000行,猜测x列为整数,y列为数值。在1000列之后都是failure了,因为有拖尾字符。实际上1000行后x列为双精度浮点数,y列为日期。因此我们在读取命令中加入col_types,指定x列为col_double(),y列为col_date()

challenge <- read_csv(
  readr_example("challenge.csv"),
  col_types = cols(
    x = col_double(),
    y = col_date()
  )
)

将所有列作为字符向量读入:

challenge2 <- read_csv(readr_example("challenge.csv"),
col_types = cols(.default = col_character())
)

使用type_convert()转换数据类型:

df <- tribble(
~x, ~y,
"1", "1.21",
"2", "2.32",
"3", "4.56"
)
df
#> # A tibble: 3 × 2
#> x y
#> <chr> <chr>
#> 1 1 1.21
#> 2 2 2.32
#> 3 3 4.56
# 注意列类型
type_convert(df)
#> Parsed with column specification:
#> cols(
#> x = col_integer(),
#> y = col_double()
#> )
#> # A tibble: 3 × 2
#> x y
#> <int> <dbl>
#> 1 1 1.21
#> 2 2 2.32
#> 3 3 4.56

5.保存、导出

write_csv导出后,列的数据类型会丢失。
替代方式:
(1)write_rds(),read_rds-R自定义的二进制格式
(2)feather包中的write_feather和read_feather-在多种编程语言间通用。

6.其他类型的数据

• haven 可以读取SPSS、Stata 和SAS 文件;
• readxl 可以读取Excel 文件(.xls 和.xlsx 均可);

上一篇 下一篇

猜你喜欢

热点阅读