20151208 [Coursera] R Programming (10)

整理自 R Programming (Week 2)

[ Week 2 課程內容 ]
 
 
[ 筆記內容 ]
  • (一)Coding Standards
  • 1. 使用"文本格式"(text files)來儲存資料。
  • 2. 經常使用"縮排"(Indent)。
  • 3. 將一系列複雜的功能製作成函數分類。
  • (二)Dates and Times
  • 1. Dates and Times in R
  • 2. Dates in R
  • 3. Times in R
  • 4. Operations on Dates and Times
  • 5. Summary
 
 
 
 

(一)Coding Standards

[ 參考資料 ]
 
 
[重點整理] 撰寫程式的基本規範
1. 使用"文本格式"(text files)來儲存資料。
 
 
2. 經常使用"縮排"(Indent),同時要記得限制每一行程式的寬度。
  • 建議使用4個以上的空格作為縮排,可以讓程式碼變得容易閱讀
  • [ 如何在 R Studio 裡設定縮排 ]
  • STEP_1 : 在上方選取"Tools",再點選"Global Options..."
 
  • STEP_2 : 點選"Code Editing",設定縮排和最大欄位數
 
 
3. 將一系列複雜的功能製作成函數分類,同時限制個別函數的長度,可以讓程式簡單化。
 
 
 
 

(二)Dates and Times

[ 參考資料 ]
 
 
[ 重點整理 ] 
1. Dates and Times in R
  • R 使用一套特殊的數據類型來表示日期和時間:
  1. "日期" 用 "Date" 類別表示(不包括時間)
  • 用來表示 "某年某月某日"
  • 內部日期是以 "1970年1月1日" 起至今的天數表示
  1. "時間" 用 "POSIXct" "POSIXlt" 類別表示
  • 內部時間是以 "1970年1月1日" 起至今的秒數表示
 
 
2. Dates in R
  • 在 R 裡面輸入字串(例如:1970-01-01 ),然後使用 "as.Date()" 函數把它轉換成日期:
# Dates in R
> x <- as.Date("1970-01-01")
> x
[1] "1970-01-01"
> unclass(x)    # 消除"x"的類別
[1] 0           # 因為"1970-01-01"與 R 內部預設的基準日期"1970-01-01"相差"0"天,所以得到數字"0"
> unclass(as.Date("1970-01-02"))
[1] 1           # 因為"1970-01-02"與 R 內部預設的基準日期"1970-01-01"相差"1"天,所以得到數字"1"
>
 
 
3. Times in R
  • "時間"使用兩種類別表示:"POSIXct" "POSIXlt"
  • (1) "POSIXct":將時間以"數字"型態儲存(整數向量)
  • < 適用情況 >:將時間儲存於數據框
  • (2) "POSIXlt":將時間以"列表"型態儲存,除此之外還儲存了以下資訊:
  • 這個時間是星期幾
  • 是一年中的第幾天
  • 是幾月幾號
 
  • 其他相關的時間函數(通用型,對 "Date"、"POSIXct"或"POSIXlt"皆適用):
  • (1) "weekdays()":指定的時間或日期是星期幾
  • (2) "months()":指定的時間或日期在幾月份
  • (3) "quarters()":指定的時間或日期在第幾季
  • "Q1":第一季(1 - 3月)、"Q2":第二季(4 - 6月)、"Q3":第三季(7 - 9月)、"Q4":第四季(10 - 12月)
 
  • 可以在 R 裡面輸入字串,再使用 "as.POSIXct()"或"as.POSIXlt()" 函數把它轉換成時間:
  • [ 情況1 ] "POSIXlt()型態"
# Times in R (使用"as.POSIXlt()"轉換類型)
> x <- Sys.time()        # 顯示系統目前的時間
> x
[1] "2015-12-08 15:55:01 CST"
> p <- as.POSIXlt(x)     # 使用"as.POSIXlt()"轉換類型,(提示:"POSIXlt"類別的儲存型態為"列表")
> names(unclass(p))     
 [1] "sec"    "min"    "hour"   "mday"  
 [5] "mon"    "year"   "wday"   "yday"  
 [9] "isdst"  "zone"   "gmtoff"
> p$sec
[1] 1.995
 
  • [ 情況2 ] "POSIXct型態"
# Times in R ("POSIXct"型態)
> x <- Sys.time()    # 顯示系統目前的時間
> x                  # "x"已經以"POSIXct"型態儲存
[1] "2015-12-08 16:07:49 CST"
> unclass(x)
[1] 1449562069       # 取得"1970-01-01"至今的秒數
> x$sec              
Error in x$sec : $ operator is invalid for atomic vectors
> p <- as.POSIXlt(x)    # 使用"as.POSIXlt()"轉換類型,(提示:"POSIXlt"類別的儲存型態為"列表")
> p$sec
[1] 49.431
 
  • [ 將字串轉換成其他格式 ] - strptime()
  • strptime() 可以將字串格式的日期轉換成日期或時間物件。
# strptime()
> x <- strptime(c("2006-01-08 10:07:52", "2006-08-07 19:33:02"), "%Y-%m-%d %H:%M:%S", tz = "EST5EDT")
> x
[1] "2006-01-08 10:07:52 EST" "2006-08-07 19:33:02 EDT"
> class(x)
[1] "POSIXlt" "POSIXt" 
>
 
 
4. Operations on Dates and Times
# 對日期進行減法,比較兩個日期之間的差異(1)
> x <- as.Date("2012-01-01")    # "Date" 類別
> y <- strptime("2011-01-09 11:34:21", "%Y-%m-%d %H:%M:%S", tz = "EST5EDT") # "POSIXlt" 類別
> x-y    # 不同類別之間無法進行運算
Error in x - y : non-numeric argument to binary operator
In addition: Warning message:
Incompatible methods ("-.Date", "-.POSIXt") for "-" 
> x <- as.POSIXlt(x)            # 將 "Date" 類別轉換為 "POSIXlt" 類別
> x-y
Time difference of 356.3095 days
 
# 對日期進行減法,比較兩個日期之間的差異(2)
# 適用於"平、閏年"、"閏秒"、"時區"之間的差異計算
> x <- as.Date("2012-03-01")    # 註:西元2012年是"閏年",所以有"2月29日"
> y <- as.Date("2012-02-28")
> x-y
Time difference of 2 days       # 因為西元2012年是"閏年",所以"3月1日"跟"2月28日"差2天
>
> x <- as.POSIXct("2015-12-08 21:00:00")    # 取得電腦目前所在的時間,在這裡是"台北(UTC)"時區
> y <- as.POSIXct("2015-12-08 18:00:00", tz = "GMT")    # 取得"格林尼治(GMT)"時區對應時間
> y-x
Time difference of 5 hours
 
 
5. Summary
  • 在 R 裡面有特殊的類別來表示 "日期(Dates)" "時間(times)"。
  • "日期" 使用 "Date" 類別
  • "時間" 使用 "POSIXct" "POSIXlt" 類別
  • 可以使用 "Strptime()" 函數將字串轉換成 "日期/時間" 類別,亦可使用 "as.Date()"、"as.POSIXlt()" "as.POSIXct()"