顯示具有 r 標籤的文章。 顯示所有文章
顯示具有 r 標籤的文章。 顯示所有文章

2016/2/23

在 R 中繪製地圖視覺化 leaflet:臺灣地區液化潛能製圖

在 R 中繪製地圖視覺化 leaflet:臺灣地區液化潛能製圖

今年春節前夕,發生了台南的大地震也讓人正視到台灣位於斷層帶的現實;

以下介紹,如何繪製 臺灣地區液化潛能製圖

首先你要有資料! 資料可以由網路上取得論文 本資料採用的是謝昇航 (2011)的論文 臺灣地區液化潛能製圖 下載位址: http://ir.lib.ncu.edu.tw:88/thesis/view_etd.asp?URN=976204004)

在附錄部份,作者提供了完整的資料表格;

一開始我使用的方式是:複製資料到 excel 後,錄製一段簡單的 VBA 將資料整理成一般資料表型式的 csv。後續有人提供可以用另外一套解決方案:tabula,可以直接捉取 pdf 資料輸出成 csv 格式,亦可以達成相同目的。

因為預設座標系統格式是 TWD97 格式,所以請專人協助後轉換為一般經緯度格式(即 EPSG 4326)。

對於資料有興趣的人,請直接整理好後的原始資料 https://drive.google.com/file/d/0B4523k7TnHsoRXYtNUcxUGh0T2s/view?usp=sharing

接下來就是正題了,若要繪製地圖 首先你要安裝 leaflet 套件,另外建議可以搭搭 dplyr 可以讓語法更為簡潔精練 然後試試以下的語法

leaflet( ) %>% addTiles( )

此時若你是使用 Rstudio 做為 IDE 工具,應該發現已經出現世界地圖了; 接下來我們要做的事情就是將我們的資料置入於地圖中

此時我們可以把我們的資料讀進來 例如:(實際路徑請自己依情況調整) dfmap <- read.delim("SheetR_MAP.csv",stringsAsFactors=FALSE)

然後把剛剛的語法調整如下: leaflet(df_map ) %>% addTiles( )

此時什麼事情都沒有發生,因為我們還是沒有告訴 leaflet 要如何繪製圖形 好歹,我們要告訴 leaflet 各點位的經緯度吧?

m <- leaflet(df_map ) %>% addTiles( )

最基本的語法如下: m %>% addCircleMarkers( lat = ~ Lat , lng = ~ Lon ) 此時就可以將所有探測點給標示出來:

P1

當然,我們感興趣的重點不會是探測點的位置,而是實際液化狀況為何? 因為資料量高達3000多點,若直接標示數值會顯得非常沒有意義; 此時可以依據論文作者所提示的數值間距,進行群組分類:

PL範圍: PL > 15 高度液化潛能

5<PL ≦15 中度液化潛能

0<PL ≦5輕度液化潛能

PL=0液化潛能極低

定義資料(顏色)群組:

pal <- colorBin(palette=c(green,pink,red,purple),domain=df_map$Pl,bins=c(0,5,10,15,70),pretty=TRUE,na.color=#808080,alpha=F)

備註:於資料整理階段時已知最高值不會高於70

所以再將程式碼修改為:

m %>%
addCircleMarkers( lat = ~ Lat , lng = ~ Lon ,color=~pal(Pl) ) 地圖上就會變成花花綠綠

最後,因為想要透過網路與網友們分享,我再加入了一些互動的功能 例如:游標指向的點會出現資料數值、可以針對區域做選擇

最終版本的視覺化結果如下: P2

程式碼提供如下:

可以發現若扣掉說明文字,整個具備基礎互動功能的地圖視覺化用了不到30行的程式碼… leaflet 的確在地圖視覺化解決方案上有蠻高的競爭優勢!

2015/11/9

R 套件異常時如何重新安裝


最近碰到一個奇怪的問題,使用 ggfortify 套件,想要將迴歸的圖形利用 autoplot 輸出發生了問題,顯示 “no layers in plot”


程式碼:
library( ggfortify)
autoplot (lm(Sepal.Length ~ Sepal.Width , data = iris))

異常訊息:
“no layers in plot”
但如果是要繪裂 pca 等統計圖形則正常 …


分別用以下2種方式重新安裝套件都無法解決

(1)
install.packages('ggfortify')
會顯示警告訊息:
Warning in install.packages :
  package ‘ggfortify’ is not available (for R version 3.2.2)


(2)
library(devtools)
install_github('sinhrks/ggfortify')
能安裝,但依舊無解


上網查到的解法如下:

install.packages('ggfortify', dependencies=TRUE, repos='http://cran.rstudio.com/')

另外也利用 Rstudio 檢查了久未更新的其他套件,將其一併更新…
終於可以正常執行 autoplot 指令

參考網址:
http://stackoverflow.com/questions/25721884/how-should-i-deal-with-package-xxx-is-not-available-for-r-version-x-y-z-wa


2015/10/30

Windows系統讀取包含日文、韓文的UTF8 文件 [R]

眾所皆知,w indows系統在處理編碼上是非常弱勢的;

相對於 linux 與 mac 在讀寫各式不同編碼的純文件時,只需要指定好 encoding 的內容就可以正常讀取;目前經過我交叉測試,在windows中如果UTF8文件中包含了日文、韓文的UTF8文件還是無法正確讀取…

將問題與解法整理成如下2張圖:
123
456
可依情境加以使用不同解決方案,這2種方式都可以正確讀取含有日文、韓文等文字的UTF8文件…若使用原始系統搭載的 read.csv() 則執行指令時會報錯!!

備註:

(1)readxl套件,請參考:
http://www.r-bloggers.com/get-data-out-of-excel-and-into-r-with-readxl/

(2)readr套件,請參考:
http://www.r-bloggers.com/readr-0-2-0/

readr還含許多方便的機能,例如猜文件編碼的函數
guess_encoding(文件名稱), 非常實用!!!

2015/10/14

Windows 處理UTF8 CSV就是悲劇… Excel與R搭配時的解法…

Excel處理CSV UTF8 編碼就是悲劇!!!!

    • excel 2016在英文版介面下,匯入文字檔(csv、txt)無法選擇UTF8編碼,只有2種編碼ansi、mac可選
    • excel 2016在中文版介面下,匯入文字檔(csv、txt),可選擇UTF8編碼及其他世界各國文字編碼
    • 總之微軟放棄不是很想認真處理 UTF8 CSV的問題…

    利用Excel協助Data Clean :

    • 不要讓excel直接處理csv UTF8格式
      • 正常讀取utf的文字編輯軟體打開uft8文件
      • 於文字編輯軟體中全選文字→複製貼上至excel→excel中進行資料剖析(這樣比由匯入文字檔還快…)
    • Data Clean成功後,直接轉存成xlsx

  • 被excel存檔過後的csv會自動變成BIG5編碼 → 避免夜長夢多,請不要這樣做
  • excel要存檔成UTF8,有UTF8文字檔的 → 超難用!!!!
  • PowerBI 也無法處理 UTF8 csv → 存成預設為UTF8的 xlsx 保證沒問題

  • 與R搭配時,不想管編碼問題直接用excel存成xlsx、xls:

    • 避免處理編碼的問題時,直接把csv改存成xlsx或xls格式
    • 安裝套件 install.packages(readxl) # 此套件可讀入單頁sheet
      • xlsx格式: 使用xml進行資料儲存,預設已是UTF8編碼;可將副標名改為zip後,解壓縮即可驗證
      • xls格式: 編碼套件 readxl 會幫忙轉成uft8
      • 所以 read_excel 指令中沒有指定編碼的選項!!!
    • 讀入資料,記住如果xlsx、xls內有多張sheet要指定sheet,否則只能讀入一個sheet
      • 例: read_excel(/Users/xxx/Downloads/WeareJordan.xls,sheet=3)
      • 別忘了在 windows 底下目錄名稱要用2個\指定
        • 例: read_excel(c:\Users\zzz\Desktop\CHINA.xls )
    • 在mac底下,讀入的檔名不可以是數字開頭的檔名,例如: 444_js.xls 要改成變數命名規則 js.xls ;winodws則無此限制,但為了未來跨平台,請直接以英文做為檔名開頭
    • 在windows底下,檢視匯入的資料時,若非big5編碼內的文字會以uft8的編碼型式顯示;而在mac則無此問題

    長治久安之道,資料量小時請存成xlsx,資料量多時請用資料庫管理…

    • 資料量少的時候而且資料有大量與Excel協作機會時,可以考慮直接將資料亦寫成 xlsx 輸出
      • 安裝套件 install.packages(openxlsx)
      • 使用資料 write.xlsx() 寫檔至 xlsx
    • 隨著資料愈來愈多,可以考慮存成直接支援uft8的資料庫系統;例如:sqlite可跨平台使用,且支援UTF8openxlsx
      • Excel亦支援各式資料庫直接進行連結

    2015/10/7

    RCurl 設定 SSL 驗證 [R]


    例如:

    library(RCurl)
    getURL("https://www.python.org"  )

    會得到
    * Error in function (type, msg, asError = TRUE) : error setting certificate verify locations:
      CAfile: /etc/pki/tls/certs/ca-bundle.crt
      CApath: none

    調整為:

    library(RCurl)
    getURL("https://www.python.org" ,   ssl.verifypeer = FALSE)

    則可取回 Html 文件

    2015/9/30

    在Windows 系統捉取網頁中文資料時會有亂碼,要如何處理?[R]

    Q:在Windows 系統捉取網頁中文資料時會有亂碼,要如何處理?

    A:使用 library(tmcn) 套件轉utf8


    效果節錄:
    未使用tmcn套件前:
    [1] “\xe7摰單\x87\xae葉敹圾\xe9\xe6\x89偷\xe5 \xe5\xe9\xe5\xe5璈\xe6頧\x9f”
    [2] “鈭箸腦\xe6\x96嚗\xb6晷\xe3\u0080擛亦\xb5\u0080\x8d 瞈\u0080瘣芷\xe7\x87\xe6”
    使用tmcn套件與 toUTF8 函數後:
    [1] “大樹阻台北淡水路 北投警冒雨排除”
    [2] “曾抗議連戰赴中被美禁入境 王世堅坦然面對”

    2015/9/20

    [備忘]使用 Docker 中的R Jupyter,中文顯示與輸出異常??


    [備忘]使用 Docker 中的R Jupyter,中文顯示與輸出異常??


    問題:

    使用 Docker 中的R Jupyter,中文顯示與輸出異常??

    輸入中文字串正常,檢查編碼也是 UTF-8

    解法:[暫解]


    • 在R中設定語系:   Sys.setlocale(category = "LC_ALL", locale = "C.UTF-8") 
    • Sys.setlocale()的效果是暫時性的,下次再開一個新的notebook時需要重新啟用

    • 經過測試,在讀入網頁時都會自動轉成 UTF-8 也都能無誤的輸出 UTF-8 資料
    • 讀入資料時,例如讀入 BIG5 編碼的 CSV 文件時,只要指定正確編碼格式也能正確讀入R中  ---ex: read.table("ubike-sampledatabig5.csv" ,header=TRUE, fileEncoding="BIG5")
    • 網路上有建議將 BIG5 文件全部轉成 UTF-8後再處理,在Linux應該只需要在讀入時指定好編碼格式即可…  因為我測試用  readLines 轉編碼會異常…
    • Docker 只是測試環境,所以不想在設定上尋求完美的解法;後續在生產環境時,會是單純的 R 搭配著 zh_TW.UTF-8 的設定

    困惑點:


    • 聽說在 Linux 版本的 R 不需要擔心編碼問題 ?
    若用 Sys.getlocale() 檢查只會回傳 'C' ,依網路上的文章理論上應該是不會有問題才是;但是 Jupyter 相關的討論串中也有人建議應該要加進  en_US.UTF-8 因為在部份字元排序會與 C.UTF-8 有不一致的情形發生?
    • 變數儲存中文無異常;下例: 網路上的即時新聞標題 title_css,直接以 title_css 執行,則正常顯示中文


     但是若用 print(title_css)或是 write.table()輸出文字檔,則會出現如下錯誤


    經 Encoding(title_css)檢查也是 UTF-8

    因為是 Docker 所啟用的ubuntu所以確認語系等相關設定為何?

    發現和一般安裝 Ubuntu 的狀況不同…  

    發現 Docker 中所預設的語系比一般情況下的 Ubntu 少了很多,所以若是在 R 中執行網路上建議的 Sys.setlocale(category = "LC_ALL", locale = "en_US.UTF-8")會有錯誤訊息…
    取而代之,我們可以使用

    則將變數搭配 print() 或是相關輸出函式時就能正常顯示中文 write.table()

    參考文件:







    2015/9/17

    簡單好用的 web scraping R 套件 - rvest

    近年來很流行網路爬蟲技術,可以自行捉取自己想要的資訊; 只要不是太複雜的網站,使用 R 底下的套件 httr 就可以捉取了;不過由於 httr 並沒有直接支援 CSS 與 xpath 選取,所以還要額外安裝其他的套件來輔助解析網頁資訊。

    最近發現到 rvest 這個套件,直接支援 ccs 與 xptah 選取,安裝 rvest 後,在啟用 rvest 時也會順道加入支援 pipeline 編寫,可以有效避免恐怖的巢狀地獄…
    rvest 使用如同一般網路爬蟲技術,流程如下所示:
    • 要捉的網頁真實的網址是什麼 --url = ???
    • 把網頁捉下來 --html( )
    • 解析(parse)網頁,選取所需內容(使用 CSS 或 XPATH ) --html_nodes()
    • 過濾掉其他雜質 -- 此例中我們只留下純文字就好 不留下超連結 html_text()
    因為蘋果日報最近的全幅廣告真的很討人厭 > <" ,以下就以自由時報的即時總覽的第一頁進行說明 網址如下: http://news.ltn.com.tw/list/BreakingNews

    首先我們可以使用 chrome 中的開發者工具 或是 Firefox 中的 Firebug 來協助我們進行選取,可以發現用以下的語法就能正確捉取我們所要的資料…
    • css 選取語法 .picword
    • xpath 選取語法 //*[@id='newslistul']/li/a
    接著就幾乎等於完成了,沒錯這就是最簡單的一隻網路爬蟲 :)
    此處以 css選取(html_nodes函數)舉例,並將資料存成 dataframe 格式,以利串接至資料庫中:
     
    library(rvest)
    
     news_url="http://news.ltn.com.tw/list/BreakingNews"
    
    title_css = html(news_url) %>% html_nodes(".picword") %>% html_text()
    
    my_news = data.frame(title = title_css)
    
    View(my_news)
    
    
    
    然後你就會有2個重大的發現:
    (1)網路爬蟲的入門也蠻簡單的啊~~
    (2)即時新聞大部份都不是很重要~~

    備註1:使用 xpath 選取
    將html_nodes(".picword")以html_nodes( xpath = "//*[@id='newslistul']/li/a")取代即可

    備註2: 想要取捉每篇即時新聞的網址,以利後續捉取內文的話呢??
    my_news =
    data.frame(
    title = html(news_url) %>% html_nodes(".picword") %>% html_text()  , 
    title_href = html(news_url) %>% html_nodes(".picword") %>% html_attr( "href")  ,
    stringsAsFactors=FALSE)  

    備註3: 套件作者 Github https://github.com/hadley/rvest