library(tidyverse)
讀取文件:
read_csv() 讀取逗號(hào)分隔文件痛侍、 read_csv2() 讀取分號(hào)分隔文件缅帘、 read_tsv() 讀取制表符分隔文件斯嚎、 read_delim() 可以讀取使用任意分隔符的文件丹莲。
read_fwf() 讀取固定寬度的文件昼汗。既可以使用 fwf_widths() 函數(shù)按照寬度來設(shè)定域笔喉,也可
以使用 fwf_positions() 函數(shù)按照位置來設(shè)定域取视。
read_csv() 函數(shù)的第一個(gè)參數(shù)是最重要的硝皂,該參數(shù)是要讀取的文件的路徑:
有時(shí)文件開頭會(huì)有好幾行元數(shù)據(jù)。你可以使用 skip = n 來跳過前 n 行作谭;或者使用
comment = "#" 來丟棄所有以 # 開頭的行
數(shù)據(jù)沒有列名稱稽物。可以使用 col_names = FALSE 來通知 read_csv() 不要將第一行作為列
標(biāo)題折欠,而是將各列依次標(biāo)注為 X1 至 Xn:
"\n" 是非常便捷的快捷方式贝或,用于添加新行。
na锐秦。它設(shè)定使用哪個(gè)值(或哪些值)來表示文件中的缺失值
# heights <- read_csv("data/heights.csv")
read_csv("a,b,c
1,2,3
4,5,6")
read_csv("The first line of metadata
The second line of metadata
x,y,z
1,2,3", skip = 2)
read_csv("# A comment I want to skip
x,y,z100
1,2,3", comment = "#")
read_csv("1,2,3\n4,5,6", col_names = FALSE)
read_csv("1,2,3\n4,5,6", col_names = c("x", "y", "z"))
read_csv("a,b,c\n1,2,.", na = ".")
read_csv函數(shù)與read.csv函數(shù)相比的優(yōu)勢是:
1.速度較快(約快 10 倍)
2.它們可以生成 tibble咪奖,并且不會(huì)將字符向量轉(zhuǎn)換為因子,不使用行名稱酱床,也不會(huì)隨意
改動(dòng)列名稱羊赵。
3.更易于重復(fù)使用。
8.2.2 練習(xí)
(1) 如果一個(gè)文件中的域是由“|”分隔的扇谣,那么應(yīng)該使用哪個(gè)函數(shù)來讀取這個(gè)文件昧捷?
(2) 除了 file、 skip 和 comment揍堕,還有哪些參數(shù)是 read_csv() 和 read_tsv() 這兩個(gè)函數(shù)共有的料身?
(3) read_fwf() 函數(shù)中最重要的參數(shù)是什么?
(4) 有時(shí) CSV 文件中的字符串會(huì)包含逗號(hào)衩茸。為了防止引發(fā)問題芹血,需要用引號(hào)(如 " 或 ')
將逗號(hào)圍起來。按照慣例楞慈, read_csv() 默認(rèn)引號(hào)為 "幔烛,如果想要改變默認(rèn)值,就要轉(zhuǎn)而
使用 read_delim() 函數(shù)囊蓝。要想將以下文本讀入一個(gè)數(shù)據(jù)框饿悬,需要設(shè)定哪些參數(shù)?
"x,y\n1,'a,b'"
(5) 找出以下每個(gè)行內(nèi) CSV 文件中的錯(cuò)誤聚霜。如果運(yùn)行代碼狡恬,會(huì)發(fā)生什么情況?
read_csv("a,b\n1,2,3\n4,5,6")
read_csv("a,b,c\n1,2\n1,2,3,4")
read_csv("a,b\n"1")
read_csv("a,b\n1,2\na,b")
read_csv("a;b\n1;3")
# (1)
# read_delim()
# (2)
?read_csv
?read_tsv
# 參數(shù)col_names,col_types,locale,na,quoted_na,quote,等參數(shù)都一樣
# (3)
?read_fwf
# 最重要的是分割符參數(shù)col_positions蝎宇,告訴列從哪開始和結(jié)束
# (4)
x <- "x,y\n1,'a,b'"
read_delim(x, ",", quote = "'")
# read_csv也支持該參數(shù)
read_csv(x, quote = "'")
read_csv("a,b\n1,2,3\n4,5,6") # 列名只有兩個(gè)弟劲,其中的元素被舍棄
read_csv("a,b,c\n1,2\n1,2,3,4") # 元素少了一個(gè),用NA補(bǔ)全
read_csv("a,b\n\"1")
read_csv("a,b\n1,2\na,b")
read_csv("a;b\n1;3")
8.3 解析向量
parse_*() 函數(shù)族函數(shù)接受一個(gè)字符向量姥芥,并返回一個(gè)特定向量兔乞,如邏輯、整數(shù)或日期向量
也即指明輸入的是何種類型的數(shù)據(jù)
na 參數(shù)設(shè)定了哪些字符串應(yīng)該當(dāng)作缺失值來處理
str(parse_logical(c("TRUE", "FALSE", "NA")))
str(parse_integer(c("1", "2", "3")))
str(parse_date(c("2010-01-01", "1979-10-14")))
parse_integer(c("1", "231", ".", "456"), na = ".")
- parse_logical() 和 parse_integer() 函數(shù)分別解析邏輯值和整數(shù)。
- parse_double() 是嚴(yán)格的數(shù)值型解析函數(shù)庸追, parse_number() 則是靈活的數(shù)值型解析函數(shù)霍骄。
- parse_character() 函數(shù)
- parse_factor() 函數(shù)可以創(chuàng)建因子, R 使用這種數(shù)據(jù)結(jié)構(gòu)來表示分類變量淡溯,該變量具有
固定數(shù)目的已知值读整。 - parse_datetime()、 parse_date() 和 parse_time() 函數(shù)可以解析不同類型的日期和時(shí)間咱娶。
8.3.1 數(shù)值
parse_number() 可以忽略數(shù)值前后的非數(shù)值型字符绘沉。這個(gè)函數(shù)特別適合處理貨幣和百分比,也可以提取嵌在文本中的數(shù)值:
parse_number('$100')
parse_number('1,233,400')
# 也可以設(shè)置分組符號(hào)
parse_number(
"123.456.789",
locale = locale(grouping_mark = ".")
)
8.3.2 字符串
計(jì)算機(jī)將字符從編碼為十六進(jìn)制數(shù)存儲(chǔ)在計(jì)算機(jī)中豺总,這個(gè)示例中的編碼方式稱為 ASCII。 ASCII 可以非常好地表示英文字符
UTF-8為目前通用的字符編碼方法择懂,
# 十六進(jìn)制數(shù)
charToRaw("Hadley")
x1 <- "El Ni\xf1o was particularly bad this year"
x2 <- "\x82\xb1\x82\xf1\x82\xc9\x82\xbf\x82\xcd"
# parse_character(x1)
# parse_character(x2) #編碼方式不對(duì)喻喳,亂碼
# encoding設(shè)置編碼方式
parse_character(x2,locale = locale(encoding = "Shift-JIS"))
# guess_encoding函數(shù)可以猜測編碼方式
guess_encoding(charToRaw(x2))
8.3.3 因子
R 使用因子表示取值范圍是已知集合的分類變量
fruit <- c("apple", "banana")
parse_factor(c("apple", "banana", "bananana"))
parse_factor(c("apple", "banana", "bananana"), levels = fruit)
8.3.4 日期、 日期時(shí)間與時(shí)間
parse_datetime() 期待的是符合 ISO 8601 標(biāo)準(zhǔn)的日期時(shí)間困曙。 ISO 8601 是一種國際標(biāo)準(zhǔn)表伦,
其中日期的各個(gè)部分按從大到小的順序排列,即年慷丽、月蹦哼、日、小時(shí)要糊、分鐘纲熏、秒
parse_datetime("2010-10-01T2010")
parse_date() 期待的是四位數(shù)的年份、一個(gè) - 或 /锄俄、月局劲、一個(gè) - 或 /,然后是日
parse_date("2010-10-01")
parse_time() 期待的是小時(shí)奶赠、 :鱼填、分鐘、可選的 : 和秒毅戈,以及一個(gè)可選的 a.m./p.m. 標(biāo)識(shí)符
library(hms)
parse_time("01:10 am")
#> 01:10:00
parse_time("20:10:01")
#> 20:10:01
# 創(chuàng)建解析函數(shù)進(jìn)行嘗試解析
parse_date("01/02/15", "%m/%d/%y")
#> [1] "2015-01-02"
parse_date("01/02/15", "%d/%m/%y")
#> [1] "2015-02-01"
parse_date("01/02/15", "%y/%m/%d")
#> [1] "2001-02-15"
8.3.5 練習(xí)
(1) locale() 函數(shù)中最重要的參數(shù)是什么苹丸?
date and time formats: date_names, date_format, and time_format
time zone: tz
numbers: decimal_mark, grouping_mark
encoding: encoding
(2) 如果將 decimal_mark 和 grouping_mark 設(shè)為同一個(gè)字符,會(huì)發(fā)生什么情況苇经?如果將 decimal_mark 設(shè)為 ,赘理, grouping_mark 的默認(rèn)值會(huì)發(fā)生什么變化?如果將 grouping_mark 設(shè)為 .塑陵,decimal_mark 的默認(rèn)值會(huì)發(fā)生什么變化感憾?
decimal_mark
and grouping_mark
must be different
(3) 我們沒有討論過 locale() 函數(shù)的 date_format 和 time_format 選項(xiàng),它們的作用是什
么?構(gòu)建一個(gè)示例阻桅,說明它們?cè)诤畏N情況下是有用的凉倚?
# 設(shè)置默認(rèn)的時(shí)間和日期格式
locale()
parse_date("1 janvier 2015", "%d %B %Y", locale = locale("fr"))
#> [1] "2015-01-01"
parse_date("14 oct. 1979", "%d %b %Y", locale = locale("fr"))
#> [1] "1979-10-14"
(4) 如果你不是居住在美國,創(chuàng)建一個(gè)新的地區(qū)對(duì)象嫂沉,并封裝你最常讀取的文件類型的相關(guān)
設(shè)置稽寒。
parse_date("02/01/2006") # 報(bào)錯(cuò)不能識(shí)別該格式
au_locale <- locale(date_format = "%d/%m/%Y") #設(shè)置新格式
parse_date("02/01/2006", locale = au_locale)
(5) read_csv() 和 read_csv2() 之間的區(qū)別是什么?
(6) 歐洲最常用的編碼方式是什么趟章?亞洲最常用的編碼方式是什么杏糙?可以使用 google 找出
答案。Chinese: GB 2312, GBK, GB 18030
(7) 生成正確形式的字符串來解析以下日期和時(shí)間蚓土。
d1 <- "January 1, 2010"
parse_date(d1,'%B %d, %Y')
d2 <- "2015-Mar-07"
parse_date(d2,"%Y-%b-%d")
d3 <- "06-Jun-2017"
parse_date(d3, "%d-%b-%Y")
d4 <- c("August 19 (2015)", "July 1 (2015)")
parse_date(d4,"%B %d (%Y)")
d5 <- "12/30/14" # 2014年12月30日
parse_date(d5,"%m/%d/%y")
t1 <- "1705"
parse_time(t1, "%H%M")
t2 <- "11:15:10.12 PM"
8.4 解析文件
- readr 如何自動(dòng)猜出文件每列的數(shù)據(jù)類型宏侍。
- 如何修改默認(rèn)設(shè)置。
策略一:根據(jù)前面的行猜測
guess_parser("2010-10-01") # 猜測
str(parse_guess("2010-10-01")) # 解析
challenge <- read_csv(readr_example("challenge.csv")) # 不能讀入
problems(challenge) #整數(shù)后面有拖尾字符
# 增加猜測行數(shù)
challenge2 <- read_csv(
readr_example("challenge.csv"),
guess_max = 1001
)
# 將所有行按字符串讀入
challenge2 <- read_csv(readr_example("challenge.csv"),
col_types = cols(.default = col_character())
)
# 然后用type_convert函數(shù)自動(dòng)解析各列
type_convert(challenge2)
8.5 寫入文件
write_csv() 和 write_tsv()
如果想要將 CSV 文件導(dǎo)為 Excel 文件蜀漆,可以使用 write_excel_csv() 函數(shù)
這幾個(gè)函數(shù)中最重要的參數(shù)是 x(要保存的數(shù)據(jù)框)和 path(保存文件的位置)谅河。還可以使
用 na 參數(shù)設(shè)定如何寫入缺失值,如果想要追加到現(xiàn)有的文件确丢,需要設(shè)置 append 參數(shù)
- haven 可以讀取 SPSS绷耍、 Stata 和 SAS 文件;
? readxl 可以讀取 Excel 文件(.xls 和 .xlsx 均可)鲜侥;
? 配合專用的數(shù)據(jù)庫后端程序(如 RMySQL褂始、 RSQLite、 RPostgreSQL 等)描函, DBI 可以對(duì)相
應(yīng)數(shù)據(jù)庫進(jìn)行 SQL 查詢崎苗,并返回一個(gè)數(shù)據(jù)框。
閱讀推薦:
生信技能樹公益視頻合輯:學(xué)習(xí)順序是linux舀寓,r益缠,軟件安裝,geo基公,小技巧幅慌,ngs組學(xué)!
B站鏈接:https://m.bilibili.com/space/338686099
YouTube鏈接:https://m.youtube.com/channel/UC67sImqK7V8tSWHMG8azIVA/playlists
生信工程師入門最佳指南:https://mp.weixin.qq.com/s/vaX4ttaLIa19MefD86WfUA