顯示具有 data process 標籤的文章。 顯示所有文章
顯示具有 data process 標籤的文章。 顯示所有文章

2020年2月23日 星期日

R語言機器學習應用班 Machine Learning in R

R語言機器學習應用班

http://www.asia-analytics.com.tw/tw/edu/e-hot-1090407.jsp

四大主軸:

1. R/RStudio操作與資料匯入

2. 資料處理與視覺化應用

3. 機器學習基礎操作

4. 機器學習進階應用


# R
# visualization
# machine learning
# 關鍵八步(匯入、摘要、樞紐、篩選、排序、NA值、轉換、合併)
graphics
# ggplot2
# arules
# party
# randomForest
# caret
@ 無需程式設計基礎
# end

2019年9月13日 星期五

資料集與使用範例

提供資料集與範例分享, 資料集來自於Open data或模擬資料.
內容包括 使用R進行 gfc.csv 視覺化範例

資料下載https://github.com/rwepa/DataDemo

Open Data 下載:

# 政府資料開放平台 https://data.gov.tw/


# UCI Machine Learning Repository https://archive.ics.uci.edu/datasets


# Google Dataset Search https://datasetsearch.research.google.com/


# Kaggle Dataset https://www.kaggle.com/datasets


# World Bank Open Data https://data.worldbank.org/


# 鄉鎮市區界線(TWD97經緯度)
主題:各鄉(鎮、市、區)行政區域界線圖資, 資料顆粒度較細.
https://data.gov.tw/dataset/7441

# 直轄市、縣市界線(TWD97經緯度)
主題:各直轄市以及縣(市)行政區域界線圖資, 資料顆粒度較大.
https://data.gov.tw/dataset/7442


# dataset
# open data
# gfc.csv
# nwind.csv
# end

2018年4月7日 星期六

R資料匯入與匯出

R資料匯入與匯出

# read.table
# read.csv
# read.fwf
檔首無BOM
# readxl 套件
RODBC 套件
# lapply
# do.call

本篇說明資料匯入與匯出。首先介紹ETL概念,其次介紹常用的資料檔案,包括文字檔案、Excel檔案、資料庫資料、JSON檔案。資料庫的匯入將以Microsoft SQL Server說明為主。最後以單一檔案較大者的「大型資料」匯入與檔案數目較多者的「大量資料」匯入等議題做為本篇的結束。


1. ETL簡介


隨著科技的進步,企業經常面對資料處理、轉換或整合等應用。「ETL (Extract-Transform-Load)擷取轉換載入」是資料分析中的基礎的應用,最早興起於1970年資料倉儲中資料庫的處理程序。ETL表示資料由資料來源端擷取 (Extract) 出來,經過轉換 (Transform),再載入 (Load)到目的端的資料傳輸整體過程。進行ETL程序時,常用串流方式方法避免資料讀取時記憶體耗盡,參考圖1所示。


圖1 ETL流程圖

擷取:從各種不同的資料來源中,將資料擷取出來。資料來源包括交易型資料庫,同質資料與異質資料來源,資料擷取具有以下特性:

  1. 可能有各式各樣的資料來源和不同的資料格式,在利用程式語言開發或使用現有工具時,必須將來源資料轉換成共同資料格式。
  2. 擷取出來的資料,比對其格式和結構是否符合所需,例如:是固定欄位長度內容的資料、還是用區隔符號定義的資料。
  3. 擷取出來的資料若不符合所需,則依照相對應的規則以決定該採取何種反應,如:另外紀錄錯誤問題並發出警告,但整個ETL流程仍繼續執行。
  4. ETL作業能擷取一個檔案或同時進行多個來源端的資料擷取。

轉換:對資料進行適當的轉換,如型態轉換、字串相連、彙總運算等,本階段會將資料儲存成適當的格式,以利事後查詢與分析。這個步驟在 ETL 中不一定需要執行。

資料轉換具有以下特性:

  1. 可針對Excel、HTTP Web Page、XML、PDF與 Binary data 資料格式等檔案格式進行資料轉換。
  2. 基於商業邏輯上的需求,必須依照應用程式資料的特性來分類、匯總、轉換資料型態;或是把經年累月所聚集的歷史資料來作合併、統計、分折及計算。
  3. 本階段的轉換元件與功能通常是最多元、最豐富的,往往也是決定ETL產品的重要考量之一。
  4. 資料轉換就是將所擷取出之資料,交付予資料轉換元件(例:log資料轉換元件),逐一並循序地依照所設計好的規則進行轉換。
  5. 載入:將資料載入目的端,目的端通常是為了報表產製及商業智慧分析而最佳化的資料倉儲。

2. 文字檔案

常用的文字檔案包括以逗號分隔值檔案(Comma-Separated Values File,簡稱CSV File),其檔案以純文字形式儲存數字和文字資料。CSV檔案亦稱為字元分隔值檔案(Character-Separated Values File),因為分隔字元也可以不是逗號,例:分號(;)、Tab符號(–>)、bar符號(|)與空白字元。CSV檔案具有以下特性:


  1. 採用純文字,使用某個字元集,例:ASCII、Unicode、UTF-8或GB2312(簡體中文環境)等儲存。
  2. 每一橫列為一筆記錄組成。
  3. 每一筆記錄以分隔符號區分欄位。
  4. 每一筆記錄都具有相同的欄位順序。
  5. 在Windows環境中使用 Microsft Office Excel 等軟體執行 檔案\另存新檔\存檔類型\ 選取「CSV(逗號分隔)()*.csv」 \ 按儲存 即可儲存為CSV檔案。
  6. 開啟CSV檔案時,最後一列為空白列,該空白列須保留不可刪除,否則匯入至R/Python會有問題。參考圖2,其中第12列為空白列。


圖2 production.csv範例

範例1:匯入production.csv檔案。

CSV檔案匯入與資料分析工作包括以下五大步驟:


步驟1 設定工作目錄:

一般資料的匯入與匯出可以先考量工作目錄的概念。R/Python軟體具有工作目錄(Working Directory)概念,即預設讀取資料的目錄。以下說明以Windows 10作業系統與R軟體[https://www.r-project.org/]操作為主。使用getwd函數以取得工作目錄,設定工作目錄為setwd函數。本範例考慮工作目錄為「C:/rdata」。

setwd("C:/rdata")
getwd()
## [1] "C:/rdata"

步驟2 準備資料檔案:


本步驟為準備好即將匯入至R的資料檔案,一般初步使用建議將資料轉換為CSV檔案較方便於後續資料匯入。下載production.csv並儲存至C:\rdata。

資料來源:production.csv

步驟3 匯入資料:

常用匯入資料為read.table函數,使用彈性較大,read.csv函數為限用CSV檔案。本例使用read.table函數以匯入CSV檔案。“production.csv”表示檔案名稱,header=TRUE表示第一列為資料欄名稱,sep=“,”表示資料以逗號區隔欄位,stringsAsFactors=FALSE表示不會將字串自動轉換為因子(Factor),而保持原字串資料型態。匯入至R之資料物件名稱為production,資料顯示為10筆,5個欄位。如果匯入資料產生亂碼情形,則可考慮以下三種解決方式:

  1. 使用記事本等軟體,將資料另存新檔且編碼設定為ANSI。
  2. 在read.table函數中加入 fileEncoding=“UTF-8”或適當編碼。
  3. 在read.table函數中加入 encoding=“UTF-8”或適當編碼。


production <- read.table("production.csv", header=TRUE, sep=",", stringsAsFactors=FALSE)
production
##    工號 生產日期 機台 生產量 目標量
## 1     1 2017/4/1    A     50     60
## 2     2 2017/4/1    A     60     60
## 3     2 2017/4/1    A     40     60
## 4     2 2017/4/2    B     70    100
## 5     3 2017/4/2    B    120    100
## 6     3 2017/4/3    B     80    100
## 7     4 2017/4/3    C     30     50
## 8     1 2017/4/4    C     35     50
## 9     4 2017/4/4    C     60     50
## 10    2 2017/4/4    C     80     50

步驟4 資料分析:

資料匯入完成後,首要步驟是分別使用str函數與summary函數進行資料結構理解與統計摘要分析。int表示整數(Integer),chr表示字串(String)或稱為字元(Chacter)。summary函數會輸出以下6個統計量:

  1. Min :最小值(Minimum)
  2. 1st Qu :25百分位數,符號 Q1
  3. Median :中位數,符號 Q2
  4. Mean :平均數
  5. 3rd Qu :75百分數位,符號 Q3
  6. Max :最大值(Maximum)

str(production)
## 'data.frame':    10 obs. of  5 variables:
##  $ 工號    : int  1 2 2 2 3 3 4 1 4 2
##  $ 生產日期: chr  "2017/4/1" "2017/4/1" "2017/4/1" "2017/4/2" ...
##  $ 機台    : chr  "A" "A" "A" "B" ...
##  $ 生產量  : int  50 60 40 70 120 80 30 35 60 80
##  $ 目標量  : int  60 60 60 100 100 100 50 50 50 50
summary(production)
##       工號       生產日期             機台               生產量     
##  Min.   :1.0   Length:10          Length:10          Min.   : 30.0  
##  1st Qu.:2.0   Class :character   Class :character   1st Qu.: 42.5  
##  Median :2.0   Mode  :character   Mode  :character   Median : 60.0  
##  Mean   :2.4                                         Mean   : 62.5  
##  3rd Qu.:3.0                                         3rd Qu.: 77.5  
##  Max.   :4.0                                         Max.   :120.0  
##      目標量   
##  Min.   : 50  
##  1st Qu.: 50  
##  Median : 60  
##  Mean   : 68  
##  3rd Qu.: 90  
##  Max.   :100
# 新增達成率欄位,計算方式為生產量/目標量
production$達成率 <- round((production$生產量/production$目標量)*100)
production
##    工號 生產日期 機台 生產量 目標量 達成率
## 1     1 2017/4/1    A     50     60     83
## 2     2 2017/4/1    A     60     60    100
## 3     2 2017/4/1    A     40     60     67
## 4     2 2017/4/2    B     70    100     70
## 5     3 2017/4/2    B    120    100    120
## 6     3 2017/4/3    B     80    100     80
## 7     4 2017/4/3    C     30     50     60
## 8     1 2017/4/4    C     35     50     70
## 9     4 2017/4/4    C     60     50    120
## 10    2 2017/4/4    C     80     50    160

# 繪製達成率統計圖
plot(production$達成率, xlab="人次", ylab="達成率(%)", main="2018年達成率統計圖", type="b", sub="製表:RWEPA, March 12, 2018")



步驟5 匯出分析結果:

最後步驟是將分析的結果,包括文字與圖檔等進行資料匯出,常用的文字資料匯出函數是write.table與R專用資料格式(RData)save函數。本例使用write.table函數 匯出成production.output.csv檔案,使用save函數匯出成production.output.RData。

write.table(production, file="production.output.csv", sep=",", row.names=TRUE)
save(production, file="production.output.RData")

如果文字檔案是採用固定寬定方式儲存,則匯入資料時可採用  read.fwf 函數匯入。例:固定寬度檔案名稱是 myfix.txt,資料寬度分別為1, 2, 3個空白字元, 4個字元,則匯入方法如下,其中 -3 表示跳過3行不讀取:

read.fwf("myfix.txt", widths = c(1, 2, -3, 4))

3. Excel檔案

Excel檔案是常用辦公室資料檔案格式,除了以Microsoft Office Excel軟體進行操作,另外可使用readxl套件匯入Excel檔案並進行資料操作處理。

範例2:匯入 production.xlsx 檔案。

首先將範例1的 production.csv 另儲存成 production.xlsx。使用 excel_sheets函數理解工作表個數,使用 read_excel讀取工作表,其中mydf1,mydf2,mydf3結果皆相同。

library(readxl)
# 顯示工作表名稱
datasets <- "production.xlsx"
excel_sheets(datasets)
## [1] "production"
# 讀取Excel檔案
mydf1 <- read_excel(datasets) # 預設讀取第1個工作表
mydf2 <- read_excel(datasets, 1) # 指定第1個工作表
mydf3 <- read_excel(datasets, "production") # 指定工作表名稱

mydf1
## # A tibble: 10 x 5
##     工號 生產日期            機台  生產量 目標量
##    <dbl> <dttm>              <chr>  <dbl>  <dbl>
##  1  1.00 2017-04-01 00:00:00 A       50.0   60.0
##  2  2.00 2017-04-01 00:00:00 A       60.0   60.0
##  3  2.00 2017-04-01 00:00:00 A       40.0   60.0
##  4  2.00 2017-04-02 00:00:00 B       70.0  100  
##  5  3.00 2017-04-02 00:00:00 B      120    100  
##  6  3.00 2017-04-03 00:00:00 B       80.0  100  
##  7  4.00 2017-04-03 00:00:00 C       30.0   50.0
##  8  1.00 2017-04-04 00:00:00 C       35.0   50.0
##  9  4.00 2017-04-04 00:00:00 C       60.0   50.0
## 10  2.00 2017-04-04 00:00:00 C       80.0   50.0

mydf2
## # A tibble: 10 x 5
##     工號 生產日期            機台  生產量 目標量
##    <dbl> <dttm>              <chr>  <dbl>  <dbl>
##  1  1.00 2017-04-01 00:00:00 A       50.0   60.0
##  2  2.00 2017-04-01 00:00:00 A       60.0   60.0
##  3  2.00 2017-04-01 00:00:00 A       40.0   60.0
##  4  2.00 2017-04-02 00:00:00 B       70.0  100  
##  5  3.00 2017-04-02 00:00:00 B      120    100  
##  6  3.00 2017-04-03 00:00:00 B       80.0  100  
##  7  4.00 2017-04-03 00:00:00 C       30.0   50.0
##  8  1.00 2017-04-04 00:00:00 C       35.0   50.0
##  9  4.00 2017-04-04 00:00:00 C       60.0   50.0
## 10  2.00 2017-04-04 00:00:00 C       80.0   50.0

mydf3
## # A tibble: 10 x 5
##     工號 生產日期            機台  生產量 目標量
##    <dbl> <dttm>              <chr>  <dbl>  <dbl>
##  1  1.00 2017-04-01 00:00:00 A       50.0   60.0
##  2  2.00 2017-04-01 00:00:00 A       60.0   60.0
##  3  2.00 2017-04-01 00:00:00 A       40.0   60.0
##  4  2.00 2017-04-02 00:00:00 B       70.0  100  
##  5  3.00 2017-04-02 00:00:00 B      120    100  
##  6  3.00 2017-04-03 00:00:00 B       80.0  100  
##  7  4.00 2017-04-03 00:00:00 C       30.0   50.0
##  8  1.00 2017-04-04 00:00:00 C       35.0   50.0
##  9  4.00 2017-04-04 00:00:00 C       60.0   50.0
## 10  2.00 2017-04-04 00:00:00 C       80.0   50.0

範例3:參考圖3,使用Excel開啟CSV檔案會有亂碼情形。


圖3 CSV檔案亂碼

改善方式之一是考慮使用文字編輯軟體,修改編碼方式,本例使用免費軟體Notepad++,將編碼由原先的「編譯成UTF-8碼(檔首無BOM)」修改為「編譯成 UTF-8 碼」,再儲存檔案後使用Excel開啟即沒有亂碼,詳細參考圖4之設定。


圖4 CSV檔案亂碼-UTF-8


4. 資料庫資料


關於微軟(Microsoft)大量結構性資料匯入與匯出,Microsoft SQL Server提供以下工具:


  1. bcp公用程式 (bulk copy program): 提供大量資料匯入與匯出功能,可以由使用者指定格式,在 Microsoft SQL Server 執行個體與資料檔案之間大量複製資料。
  2. BULK INSERT 陳述式:可將資料直接從資料檔案匯入至資料庫資料表或非資料分割的檢視,不提供匯出資料功能。
  3. BULK INSERT 陳述式與 INSERT…SELECT * FROM OPENROWSET(BULK…) 陳述式 :將大量資料檔案匯入到 SQL Server 資料表中,不提供匯出資料功能。
  4. SQL Server Data Tools (SSDT) 來執行 SQL Server 匯入和匯出精靈。

資料來源:https://docs.microsoft.com/zh-tw/sql/relational-databases/import-export/bulk-import-and-export-of-data-sql-server

R可採用 RODBC 套件與Microsoft SQL Server資料庫連結,其中 sqlQuery 函數可執行資料匯入至R/R物件寫入SQL資料庫,部分執行畫面參考圖5,詳細參考 RODBC 與 SQL Server 資料匯入與寫入

圖5 RODBC-寫入


5. JSON檔案


JSON(JavaScript Object Notation)是一種由Douglas Crockford 構想和設計、輕量級的資料交換語言,該語言以易於讓人閱讀的文字為基礎,用來傳輸由屬性值或者序列性的值組成的資料物件。儘管JSON是Javascript的一個子集,但JSON是獨立於語言的文字格式,並且採用了類似於C語言家族的一些習慣,詳細參考官方網站[http://www.json.org/]

資料來源:https://en.wikipedia.org/wiki/JSON

JSON資料物件包括:

  1. 物件 object : {name:value}
  2. 陣列 array : [x1, x2, …]

JSON資料型態包括:

  1. 空值(null)
  2. 邏輯值(true, false)暨布林值。
  3. 數值(number),沒有區分整數與具有小數點數。
  4. 字串(string)。

RJSONIO 套件提供以下二大函數,詳細參考函數線上說明:


  1. toJSON() : 轉換 R 物件為 JSON 字串。
  2. fromJSON() : 轉換 JSON物件為 R 物件, 資料來源包括 URL, File, R物件。

JSON資料參考圖1.4.6 JSON-錄影節目影片範例。


圖6 JSON-錄影節目影片範例

資料來源:http://vida.moc.gov.tw/VIDA411.ASP?ISSUEYM=10306


6. 大型資料


大型資料指的是單一檔案較大,使用傳統read.table或read.csv函數可能匯入時間教長,此時可使用data.table套件的fread函數以提升匯入效能,詳細參考以下圖7 大型資料範例。



圖7 大型資料範例

上述大型資料亦可使用 bigmemory套件匯入資料,參考圖8 大型資料-bigmemory範例。



圖8 大型資料-bigmemory範例


7. 大量資料


大量資料指的是檔案較多時,使用傳統 read.table或 read.csv函數逐一匯入較不方便,此時可使用 lapply函數,詳細參考以下大量資料範例,考慮將三個檔案,每個檔案是10列5行,合併為單一資料物件30列5行。

lapply 函數主要包括2個參數 lapply(資料物件, 函數),其回傳結果是串列(list):

  1. 第一個參數是須要處理的資料物件,一般是向量資料,本例 files 表示三個檔案路徑。
  2. 第二個參數是函數,本例是 read.table,後續 header=TRUE, sep="," 是配合 raed.table使用。

do.call 函數是將三個串列合併為一個資料框(data.frame)。

# 大量資料範例
working_path <- "C:/rdata"
setwd(working_path)
getwd()
## [1] "C:/rdata"
sample1 <- iris[sample(1:nrow(iris),10),]
sample2 <- iris[sample(1:nrow(iris),10),]
sample3 <- iris[sample(1:nrow(iris),10),]

write.table(sample1, file="sample1.csv", sep=",", row.names=FALSE)

write.table(sample2, file="sample2.csv", sep=",", row.names=FALSE)
write.table(sample3, file="sample3.csv", sep=",", row.names=FALSE)

files <- dir(getwd(), pattern="sample.*.csv", recursive=TRUE, full.names=TRUE)

files
## [1] "C:/rdata/sample1.csv" "C:/rdata/sample2.csv" "C:/rdata/sample3.csv"

tables <- lapply(files, read.table, header=TRUE, sep=",") # list

sample.all <- do.call(rbind, tables) # data.frame

str(sample.all)
## 'data.frame':    30 obs. of  5 variables:
##  $ Sepal.Length: num  5.4 4.7 5.7 6.3 6.6 7 5 4.4 5.4 6.3 ...
##  $ Sepal.Width : num  3.9 3.2 2.8 2.5 3 3.2 3.6 3 3 2.5 ...
##  $ Petal.Length: num  1.7 1.3 4.1 5 4.4 4.7 1.4 1.3 4.5 4.9 ...
##  $ Petal.Width : num  0.4 0.2 1.3 1.9 1.4 1.4 0.2 0.2 1.5 1.5 ...
##  $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 2 3 2 2 1 1 2 2 ...
# end

2017年9月9日 星期六

網路抓取 R CRAN 套件清單, 使用 ggplot2 套件繪圖, 建立第2個y軸座標.

主題: 網路抓取 R CRAN 套件清單, 使用 ggplot2 套件繪圖, 建立第2個y軸座標.
說明:

# ggplot2
# packages list
# XML
# geom_col
# goem_line
# geom_point
# scale_y_continuous


















# 2024.5.27 
# R程式碼更新ggplot2 - dual y axis標題等語法

R程式碼下載 -->


  • [#1-2] 首先載入 XML, ggplot2 套件.
  • [#3] 使用CRAN網站-依日期排列抓取現有1萬多個套件清單,
    例: http://cran.csie.ntu.edu.tw/web/packages/available_packages_by_date.html
  • [#4] 使用 readHTMLTable {XML} 函數以讀取網站中的套件清單表格, 將結果儲存為mydf資料物件.
  • [#7] 使用 trimws {base} 函數以刪除欄位名稱空白字元.
  • [#8] 原匯入第1欄 Date為字串資料型態, 使用 as.Date {base} 轉換為 日期(Date) 資料型態.
  • [#9] 使用 format {base}並取出套件更新年, 使用 table {base} 以計算各年套件個數.
  • [#10] 使用 cumsum {base}計算累計套件數並新增為 AccumulatedPAckages 欄位.
  • [#11] 使用 names {base} 設定前二欄名稱為 Year, Packages.
  • [#14] 使用 geom_col {ggplot2} 繪製"套件數(年)"長條圖, 另可使用 geom_bar {ggplot2} 繪製.
  • [#15-18] 設定主標題, x軸標題, y軸標題. theme {ggplot2} 可設定標題左右置中.
  • [#19] 使用 scale_y_continuous {ggplot2}可在繪圖區之右側建立y軸第2座標軸. 右側y軸對應長條圖的刻度. ggplot2 採用資料轉換概念, 因此左側y軸第1座標軸的刻度,對應至累計套件數, 其中最大值約11405, 右側最大值約4502, 11405/4502=2.5, 考慮以2倍計算, 即將左側刻度除以2, 轉換為右側刻度, 一般使用 trans = ~. /2 表示.
  • [#21] 使用 annotate {ggplot2} 可加上文字標題.
  • [#22-24] 使用 goem_line {ggplot2} 繪製累計套件數線圖.
  • [#25-27] 使用 goem_point {ggplot2} 繪製累計套件數點圖.
# end

2016年9月16日 星期五

中文網頁表格擷取,亂碼處理

Problem:

本篇文章討論如何使用R下載網頁的表格資料, 再進行後續處理.

Analysis:

# part 1 設定R語系為C, 以配合中文編碼使用

本例考量 RWEPA 個人簡介(About) 網頁 (http://web.ydu.edu.tw/~alan9956/02person.htm), 該網頁包括專題演講表格, 該表格包括編號,日期,主題,單位/地點,時數等5個欄位, 在R環境中, 可使用 XML 套件的 readHTMLTable 函數讀取網頁表格, 另因中文編碼考量, 先設定 locate, R程式如下:

Sys.setlocale(category="LC_ALL", locale="C")
Sys.getlocale()

# part 2 載入套件,讀取網頁資料

準備使用 XML 套件的 readHTMLTable 函數, 使用時記得加上  encoding="big5", 結果有5個表格, 其中第1個表格是使用的資料集, 因此將 tmp串列的第1個元素取出, 設定 train <- tmp[[1]], R程式如下:

library(XML) # readHTMLTable 函數
# IE: F12 --> line 7: <meta http-equiv=Content-Type content="text/html; charset=big5"> 
# 觀察原始網頁採用 big5, 因此encoding參數設定為 big5
urls <- "http://web.ydu.edu.tw/~alan9956/02person.htm"
tmp <- readHTMLTable(urls, stringsAsFactors = FALSE, encoding="big5")
length(tmp) # length=5
train <- tmp[[1]] # 139*5

# part 3 資料整理

train[1,2] # 顯示亂碼
iconv(train[1,2], "UTF-8", "BIG-5") # 顯示正常

# 中文編碼轉換
train <- as.data.frame(lapply(train, function(x) iconv(x, "UTF-8", "BIG-5")))
names(train) <- c("id", "traindate", "program", "location", "hours")
head(train)

# 匯出資料
write.table(train, file="C:/rdata/train.txt", row.names=FALSE)
# save(train, file="C:/rdata/train.RData") # 亦可儲存成 RData 格式

# R程式:

# title: RWEPA - 讀取網頁表格教育訓練
# date: 2016.9.16

# part 1 設定R語系為C, 以配合中文編碼使用
Sys.setlocale(category="LC_ALL", locale="C")
Sys.getlocale()

# part 2 載入套件,讀取網頁資料
library(XML) # readHTMLTable 函數

# IE: F12 --> line 7: <meta http-equiv=Content-Type content="text/html; charset=big5"> 
# 觀察原始網頁採用 big5, 因此encoding參數設定為 big5

urls <- "http://web.ydu.edu.tw/~alan9956/02person.htm"
tmp <- readHTMLTable(urls, stringsAsFactors = FALSE, encoding="big5")

length(tmp) # length=5
train <- tmp[[1]] # 139*5

# part 3 資料整理
train[1,2] # 顯示亂碼
iconv(train[1,2], "UTF-8", "BIG-5") # 顯示正常

# 中文編碼轉換
train <- as.data.frame(lapply(train, function(x) iconv(x, "UTF-8", "BIG-5")))
names(train) <- c("id", "traindate", "program", "location", "hours")
head(train)

# 匯出資料
write.table(train, file="C:/rdata/train.txt", row.names=FALSE)

# save(train, file="C:/rdata/train.RData") # 亦可儲存成 RData 格式

R程式執行結果:


# end

2016年8月22日 星期一

矩陣的條件式篩選

Problem:


在R的資料處理環境中,有時須先篩選符合條件的資料,再進行後續處理,以下說明如何完成此需求.

感謝R友-Mimi 提供此問題.

Analysis:
























本問題是如何找出同時滿足數值大於或等於0.5, 較辛苦的方法是將所有條件用 AND 運算(&)找出其結果. 實務上可考慮邏輯運算特性, 即 TRUE 表示1, FALSE 表示0, 利用 sum( )函數計算加總為12表示該列所有行滿足條件. 因為是每列都要判斷, 因此採用 apply, 第2個參數設定為1表示列運算. 最後以 which 回傳符合條件之指標.











# R code
# 建立矩陣範例 318*12
set.seed(123)
m <- matrix(round(c(runif(318*7), rep(1, 318*5)), 2), ncol=12)
rownames(m) <- paste0("row", 1:318)
head(m)

# 條件篩選
m.check <- (m >= 0.5)
head(m.check)

# 如果整列加總=12,表示所該列所有資料行皆符合篩選條件
ind <- which(apply(m.check, 1, sum) == 12)
ind
m[ind, ]
# end

2015年12月4日 星期五

刪除已儲存工作空間

如何刪除已儲存工作空間?

每次啟動R會顯示"[Previously saved workspace restored]", 打開我的文件也找不到.RData 檔案, 執行以下指令即可刪除此檔案, 未來開啟R也不會顯示此訊息:
unlink(".RData")

2015年9月3日 星期四

如何將資料為每列表示變數資料轉換為行資料

Problem:

如何將資料為每列表示變數,每行表示一筆記錄資料轉換為每列表示記錄,每行表示變數之資料框(data.frame)物件,此功能類似 Excel \ 複製 \ 右鍵 \ 貼上選項 \ 轉置.

感謝 R user - Hsieh 提供此問題

Analysis:

# 匯入資料 read.table 函數中,可以先設定 stringsAsFactors=FALSE, 如此所有資料可先保留字串資料型態
> myData <- read.table("rowdata.csv", sep=",", stringsAsFactors=FALSE)
> myData
     V1   V2   V3    V4    V5   V6
1  編號    1    2     3     4    5
2  型式  AAA  AAA   BBB   BBB  CCC
3 測量1   10   20    30    40   50
4 測量2  100  200   300   400  500
5 測量3 1000 2000  3000  4000 5000
6  結果   OK   OK ERROR ERROR   OK
> str(myData)
'data.frame': 6 obs. of  6 variables:
 $ V1: chr  "編號" "型式" "測量1" "測量2" ...
 $ V2: chr  "1" "AAA" "10" "100" ...
 $ V3: chr  "2" "AAA" "20" "200" ...
 $ V4: chr  "3" "BBB" "30" "300" ...
 $ V5: chr  "4" "BBB" "40" "400" ...
 $ V6: chr  "5" "CCC" "50" "500" ...


# 資料轉換(t函數),結果是矩陣 matrix,此結果與data.frame之需求不符合
> t(myData)
   [,1]   [,2]   [,3]    [,4]    [,5]    [,6]   
V1 "編號" "型式" "測量1" "測量2" "測量3" "結果" 
V2 "1"    "AAA"  "10"    "100"   "1000"  "OK"   
V3 "2"    "AAA"  "20"    "200"   "2000"  "OK"   
V4 "3"    "BBB"  "30"    "300"   "3000"  "ERROR"
V5 "4"    "BBB"  "40"    "400"   "4000"  "ERROR"
V6 "5"    "CCC"  "50"    "500"   "5000"  "OK"   
> class(t(myData))
[1] "matrix"


# 將資料轉換之矩陣再轉為資料框 data.frame,此結果應該是可以使用
> myData.df <- as.data.frame(t(myData), stringsAsFactors=FALSE)
> str(myData.df)
'data.frame': 6 obs. of  6 variables:
 $ V1: chr  "編號" "1" "2" "3" ...
 $ V2: chr  "型式" "AAA" "AAA" "BBB" ...
 $ V3: chr  "測量1" "10" "20" "30" ...
 $ V4: chr  "測量2" "100" "200" "300" ...
 $ V5: chr  "測量3" "1000" "2000" "3000" ...
 $ V6: chr  "結果" "OK" "OK" "ERROR" ...
> myData.df
     V1   V2    V3    V4    V5    V6
V1 編號 型式 測量1 測量2 測量3  結果
V2    1  AAA    10   100  1000    OK
V3    2  AAA    20   200  2000    OK
V4    3  BBB    30   300  3000 ERROR
V5    4  BBB    40   400  4000 ERROR
V6    5  CCC    50   500  5000    OK


# 欄位名稱調整
> names(myData.df) <- myData.df[1,]
>

# 考慮刪除列名稱
> row.names(myData.df) <- NULL
>

# 刪除第1列多餘資料
> (myData.df <- myData.df[-1,])
   編號 型式 測量1 測量2 測量3  結果
V2    1  AAA    10   100  1000    OK
V3    2  AAA    20   200  2000    OK
V4    3  BBB    30   300  3000 ERROR
V5    4  BBB    40   400  4000 ERROR
V6    5  CCC    50   500  5000    OK
> str(myData.df)
'data.frame': 5 obs. of  6 variables:
 $ 編號 : chr  "1" "2" "3" "4" ...
 $ 型式 : chr  "AAA" "AAA" "BBB" "BBB" ...
 $ 測量1: chr  "10" "20" "30" "40" ...
 $ 測量2: chr  "100" "200" "300" "400" ...
 $ 測量3: chr  "1000" "2000" "3000" "4000" ...
 $ 結果 : chr  "OK" "OK" "ERROR" "ERROR" ...


# 目前資料轉換正常,唯數值字料尚須轉換
# 選取1欄,將字串轉換為數值資料
> myData.df$測量1
[1] "10" "20" "30" "40" "50"
> as.numeric(myData.df$測量1)
[1] 10 20 30 40 50


> # 如果資料欄位較多,似乎須考量非一行一行轉換!
> # 判斷將所有欄資料並轉換為數值資料,保留無法轉換為數值之字串資料
> for (i in 1:dim(myData.df)[2]) {
+   if (all(!is.na(as.numeric(myData.df[,i])))) {
+     myData.df[,i] <- as.numeric(myData.df[,i])
+   }
+ }
Warning messages:
1: NAs introduced by coercion 
2: NAs introduced by coercion 


> # 第1,3-5欄已轉換為數值資料
> str(myData.df)
'data.frame': 5 obs. of  6 variables:
 $ 編號 : num  1 2 3 4 5
 $ 型式 : chr  "AAA" "AAA" "BBB" "BBB" ...
 $ 測量1: num  10 20 30 40 50
 $ 測量2: num  100 200 300 400 500
 $ 測量3: num  1000 2000 3000 4000 5000
 $ 結果 : chr  "OK" "OK" "ERROR" "ERROR" ...
> myData.df
   編號 型式 測量1 測量2 測量3  結果
V2    1  AAA    10   100  1000    OK
V3    2  AAA    20   200  2000    OK
V4    3  BBB    30   300  3000 ERROR
V5    4  BBB    40   400  4000 ERROR
V6    5  CCC    50   500  5000    OK
> # end


R code:

####################################
# title    : 列轉換為行之數值資料
# date     : 2015.9.3
# author   : Ming-Chang Lee
# email    : alan9956@gmail.com
# RWEPA    : http://rwepa.blogspot.tw/
# encoding : UTF-8
####################################
# 匯入資料
myData <- read.table("rowdata.csv", sep=",", stringsAsFactors=FALSE)
myData
str(myData)

# 資料轉換(t函數),結果是矩陣 matrix
t(myData)
class(t(myData))

# 將資料轉換之矩陣再轉為資料框 data frame
myData.df <- as.data.frame(t(myData), stringsAsFactors=FALSE)
str(myData.df)
myData.df

# 欄位名稱調整
names(myData.df) <- myData.df[1,]

# 考慮刪除列名稱
row.names(myData.df) <- NULL

# 刪除第1列多餘資料
(myData.df <- myData.df[-1,])
str(myData.df)

# 目前資料轉換正常,唯數值字料尚須轉換
# 選取1欄,將字串轉換為數值資料
myData.df$測量1
as.numeric(myData.df$測量1)

# 如果資料欄位較多,似乎須考量非一行一行轉換!
# 判斷將所有欄資料並轉換為數值資料,保留無法轉換為數值之字串資料
for (i in 1:dim(myData.df)[2]) {
  if (all(!is.na(as.numeric(myData.df[,i])))) {
    myData.df[,i] <- as.numeric(myData.df[,i])
  }
}

# 第1,3-5欄已轉換為數值資料
str(myData.df)
myData.df

# end