R數(shù)據(jù)科學(xué)(八)reader包數(shù)據(jù)導(dǎo)入

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末轰豆,一起剝皮案震驚了整個(gè)濱河市胰伍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌酸休,老刑警劉巖骂租,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異斑司,居然都是意外死亡渗饮,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來互站,“玉大人私蕾,你說我怎么就攤上這事『遥” “怎么了踩叭?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長翠胰。 經(jīng)常有香客問我容贝,道長,這世上最難降的妖魔是什么之景? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任斤富,我火速辦了婚禮,結(jié)果婚禮上锻狗,老公的妹妹穿的比我還像新娘茂缚。我一直安慰自己,他們只是感情好屋谭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著龟糕,像睡著了一般桐磁。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讲岁,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天我擂,我揣著相機(jī)與錄音,去河邊找鬼缓艳。 笑死校摩,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的阶淘。 我是一名探鬼主播衙吩,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼溪窒!你這毒婦竟也來了坤塞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤澈蚌,失蹤者是張志新(化名)和其女友劉穎摹芙,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宛瞄,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡浮禾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了窒舟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片色难。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖勒庄,靈堂內(nèi)的尸體忽然破棺而出挣轨,到底是詐尸還是另有隱情军熏,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布卷扮,位于F島的核電站荡澎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏晤锹。R本人自食惡果不足惜摩幔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鞭铆。 院中可真熱鬧或衡,春花似錦、人聲如沸车遂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽舶担。三九已至坡疼,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衣陶,已是汗流浹背柄瑰。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剪况,地道東北人教沾。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像译断,于是被迫代替她去往敵國和親授翻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容