R数据科学–第八章 readr
今天是生信星球陪你的第161天
你想找辆共享单车,发现满街都是别家车,没有一辆你能骑。
你想学点生信,搜了“初学者教程”,满眼尽是高大上,没有一句能看懂。
终于你跨越茫茫宇宙,来到生信星球,发现了初学者的新大陆!
如果你对R语言一无所知,建议先学习《零基础系列》
本系列的参考资料是:学R必备的神书《R数据科学》,如果你还不了解这本书,👇点这里。
系列连载:
英文版书籍地址:http://r4ds.had.co.nz/
啊啊啊。迟到了。这周会再补上一篇的!最近事情多,脑子乱糟糟。为了文章现学了分子对接,还参加了一次周末培训,知识量猛增,但这本神书学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,yn1,’a,b'”x <- "x,yn1,'a,b'"
read_csv(x, quote = "'")
(5) 找出以下每个行内CSV 文件中的错误。如果运行代码,会发生什么情况?read_csv("a,bn1,2,3n4,5,6")
问题:第一行只有两个数值,二、三行却有3个。第一行默认为列名,所以是定义了两列,第二、三行的第三个数就是多余的列,默认被删掉了。read_csv("a,b,cn1,2n1,2,3,4")
每行的元素个数不一样,以列名为基准,多余的被删除,缺少的为NA。read_csv("a,bn"1")
1前面的“”只有一半,被删除掉了。这个运行结果等同于read_csv("a,bn1")
read_csv("a,bn1,2na,b")
这个有问题吗?read_csv("a;bn1;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()) ) ¨G6G df <- tribble( ~x, ~y, "1", "1.21", "2", "2.32", "3", "4.56" ) df ¨K20K ¨K21K ¨K22K ¨K23K ¨K24K ¨K25K ¨K26K type_convert(df) ¨K27K ¨K28K ¨K29K ¨K30K ¨K31K ¨K32K ¨K33K ¨K34K ¨K35K ¨K36K ¨K37K
5.保存、导出
write_csv导出后,列的数据类型会丢失。
替代方式:
(1)write_rds(),read_rds-R自定义的二进制格式
(2)feather包中的write_feather和read_feather-在多种编程语言间通用。
6.其他类型的数据
• haven 可以读取SPSS、Stata 和SAS 文件;
• readxl 可以读取Excel 文件(.xls 和.xlsx 均可);
简书-小洁忘了怎么分身,同步更新花花的文章。
简书-刘小泽,同步更新豆豆的文章。
隔壁生信技能树公益视频合辑(学习顺序是linux,r,软件安装,geo,小技巧,ngs组学!)
国内看B站,教学视频链接:https://m.bilibili.com/space/338686099
国外看YouTube,教学视频链接:https://m.youtube.com/channel/UC67sImqK7V8tSWHMG8azIVA/playlists友情链接:
点击底部的“阅读原文”,获得更好的阅读体验哦😻
初学生信,很荣幸带你迈出第一步。
我们是生信星球,一个不拽术语、通俗易懂的生信知识平台。由于是2018年新号,竟然没有留言功能。需要帮助或提出意见请后台留言、联系微信或发送邮件到Bioplanet520@outlook.com,每一条都会看到的哦~
请关注“恒诺新知”微信公众号,感谢“R语言“,”数据那些事儿“,”老俊俊的生信笔记“,”冷🈚️思“,“珞珈R”,“生信星球”的支持!