解析數(shù)值似乎是非常直截了當(dāng)?shù)?,但以?3 個(gè)問題增加了數(shù)值解析的復(fù)雜性。
? 世界各地的人們書寫數(shù)值的方式不盡相同。例如,有些國(guó)家使用 . 來分隔實(shí)數(shù)中的整數(shù)
和小數(shù)部分,而有些國(guó)家則使用 ,。
? 數(shù)值周圍經(jīng)常有表示某種意義的其他字符,如 $1000 或 10%。
? 數(shù)值經(jīng)常包含“分組”,以便更易讀,如 1 000 000,而且世界各地用來分組的字符也不
盡相同。
為了解決第一個(gè)問題, readr 使用了“地區(qū)”這一概念,這是可以按照不同地區(qū)設(shè)置解析選
項(xiàng)的一個(gè)對(duì)象。在解析數(shù)值時(shí),最重要的選項(xiàng)就是用來表示小數(shù)點(diǎn)的字符。通過創(chuàng)建一個(gè)
新的地區(qū)對(duì)象并設(shè)定 decimal_mark 參數(shù),可以覆蓋 . 的默認(rèn)值:
parse_double("1.23")
#> [1] 1.23
parse_double("1,23", locale = locale(decimal_mark = ","))
#> [1] 1.23
readr 的默認(rèn)地區(qū)是 US-centric,因?yàn)?R 是以美國(guó)為中心的(也就是說, R 基礎(chǔ)包的文檔是
用美式英語寫成的)。獲取默認(rèn)地區(qū)設(shè)置的另一種方法是利用操作系統(tǒng),但這種方法很難
奏效,更重要的是,這會(huì)讓你的代碼很脆弱:即使可以在你的計(jì)算機(jī)上良好運(yùn)行,但通過
電子郵件分享給另一個(gè)國(guó)家的同事時(shí),就可能失效。
parse_number() 解決了第二個(gè)問題:它可以忽略數(shù)值前后的非數(shù)值型字符。這個(gè)函數(shù)特別
適合處理貨幣和百分比,也可以提取嵌在文本中的數(shù)值:
parse_number("$100")
#> [1] 100
parse_number("20%")
#> [1] 20
parse_number("It cost $123.45")
#> [1] 123
組合使用 parse_number() 和地區(qū)設(shè)置可以解決最后一個(gè)問題,因?yàn)?parse_number() 可以忽
略“分組符號(hào)”:
# 適用于美國(guó)
parse_number("$123,456,789")
#> [1] 1.23e+08
# 適用于多數(shù)歐洲國(guó)家
parse_number(
"123.456.789",
locale = locale(grouping_mark = ".")
)
#> [1] 1.23e+08
# 適用于瑞士
parse_number(
"123'456'789",
locale = locale(grouping_mark = "'")
)
#> [1] 1.23e+08








暫無數(shù)據(jù)