搜索
查看: 1014|回复: 2

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

[复制链接]

25

主题

49

帖子

363

积分

中级会员

Rank: 3Rank: 3

积分
363
发表于 2018-10-18 10:50:28 | 显示全部楼层 |阅读模式
本帖最后由 hijack 于 2018-10-18 10:50 编辑

  啊啊啊。迟到了。这周会再补上一篇的!最近事情多,脑子乱糟糟。为了文章现学了分子对接,还参加了一次周末培训,知识量猛增,但这本神书学R,绝不能停!
1.准备工作
[AppleScript] 纯文本查看 复制代码
library(tidyverse)
2.read.csv
[AppleScript] 纯文本查看 复制代码
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="."
[AppleScript] 纯文本查看 复制代码
read_csv("The first line of metadata
The second line of metadata
x,y,z
1,2,3", skip = 2)

练习
(1) 如果一个文件中的域是由“|”分隔的,那么应该使用哪个函数来读取这个文件?
[AppleScript] 纯文本查看 复制代码
read_delim(file, delim = "|")

(2) 除了file、skip 和comment,还有哪些参数是read_csv() 和read_tsv() 这两个函数共
有的?
[AppleScript] 纯文本查看 复制代码
union(names(formals(read_csv)), names(formals(read_tsv)))

(3) read_fwf() 函数中最重要的参数是什么?
read_fwf()读取“固定宽度格式” 的最重要的参数是col_positions告诉函数数据列开始和结束的位置。
(4) 有时CSV 文件中的字符串会包含逗号。为了防止引发问题,需要用引号(如" 或')将逗号围起来。按照惯例,read_csv() 默认引号为",如果想要改变默认值,就要转而使用read_delim() 函数。要想将以下文本读入一个数据框,需要设定哪些参数?
[AppleScript] 纯文本查看 复制代码
"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_*() 函数接受一个字符型向量,并返回一个特定向量,如逻辑、整数或日期,改变了数据类型。
[AppleScript] 纯文本查看 复制代码
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 = ",")设置。
[AppleScript] 纯文本查看 复制代码
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因子
[AppleScript] 纯文本查看 复制代码
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()
[AppleScript] 纯文本查看 复制代码
challenge <- read_csv(
  readr_example("challenge.csv"),
  col_types = cols(
    x = col_double(),
    y = col_date()
  )
)

将所有列作为字符向量读入:
[AppleScript] 纯文本查看 复制代码
challenge2 <- read_csv(readr_example("challenge.csv"),
col_types = cols(.default = col_character())
)
试用type_convert转换数据类型
[AppleScript] 纯文本查看 复制代码
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 均可);





上一篇:奇怪的现象和老师奇怪的要求
下一篇:使用stringr处理字符串数据P3
回复

使用道具 举报

2

主题

3

帖子

47

积分

新手上路

Rank: 1

积分
47
发表于 2018-10-27 22:41:31 | 显示全部楼层
每次看你的笔记,感觉豁然开朗。知识星球里也有相关总结吗?
回复 支持 反对

使用道具 举报

25

主题

49

帖子

363

积分

中级会员

Rank: 3Rank: 3

积分
363
 楼主| 发表于 2018-10-30 23:32:15 | 显示全部楼层
wmu1165 发表于 2018-10-27 22:41
每次看你的笔记,感觉豁然开朗。知识星球里也有相关总结吗?

知识星球是把这个链接搬过去。有一些问题成员提出来会解决下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|生信技能树 ( 粤ICP备15016384号  

GMT+8, 2019-8-22 22:28 , Processed in 0.037172 second(s), 27 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.