2017年6月20日 星期二

r ? <- $ () [] {} [[ @ :: 常用特殊運算子 (operators)

本篇文章說明使用R時, 會有不同特殊運算子需求, 以下說明使用方式.

?問號

?符號功能是查詢線上說明, 例: ?plot, 其功能與 help(plot) 相同, 當然使用 ?'plot'?"plot"結果皆相同. 例: ?'+' 可查詢算數運算功能.


<-運算子

<-為指派運算子, 將右邊的運算結果指派至左邊物件, 強烈建議指派運算子不要使用等號(=), 以免與函數中的參數相混淆.

> lotto <- sample(49,6)
> lotto
[1] 16  1 49 46 43  7

$符號

$符號用於取出物件內容,亦可用於串列資料的讀取.

# 取出iris資料集的Species欄位資料, 其結果為向量
iris$Species

()小括號

()符號大概是接觸R最常使用符號, 其使用時機為函數名稱

readLines(system.file("DESCRIPTION")) , summary(iris), plot(iris), 如果在小括號前加上資料物件名稱, 此時會有錯誤產生.

[]中括號

[]中括號用於將資料進行條件篩選的指標(indexing), 例: 一維或二維資料物件取出部份符合條件資料.

# Species為setosa的Sepal.Length資料
iris$Sepal.Length[iris$Species == "setosa"]

# 符合Sepal.Length大於5且Sepal.Width大於4的所有資料
iris[iris$Sepal.Length >5 & iris$Sepal.Width > 4,]

二維資料如matrix, data.frame 使用[列, 行] 方式取出資料或是取出直行欄位資料.
# 讀取iris第1至4欄資料
iris[1:4]

{}大括號

{}大括號用於標註套件名稱程式區塊.

?plot 會顯示 plot {graphics}表示 plot 函數隸屬於graphics套件.

# 程式區塊
> for (i in 1:10) {
+   if (i %% 2 == 0) {
+     print(paste0(i, "是偶數"))
+   } else {
+     print(paste0(i, "是奇數"))
+   }
+ }
[1] "1是奇數"
[1] "2是偶數"
[1] "3是奇數"
[1] "4是偶數"
[1] "5是奇數"
[1] "6是偶數"
[1] "7是奇數"
[1] "8是偶數"
[1] "9是奇數"
[1] "10是偶數"

[[ 二個左中括號

如果資料物件有顯示此符號, 一般為串列(list).
> list("RWEPA", c("R", "Python", "Julia"))
[[1]]
[1] "RWEPA"

[[2]]
[1] "R"      "Python" "Julia"

> mylist <- list(web="RWEPA", programming=c("R", "Python", "Julia"))
> mylist$programming
[1] "R"      "Python" "Julia"
> mylist[[2]]
[1] "R"      "Python" "Julia"

@運算子

@符號用於取出S4物件內容(Slot). 目前已套件支援S4物件型態, 例: kernlab 套件. S4資料物件存取須使用@運算子. 
參考: ?'@' 線上說明
參考: http://adv-r.had.co.nz/S4.html


::運算子 (Double Colon)

::運算子一般用於指定套件的函數, 如果不同套件,確有相同函數名稱,此時使用
套件名稱::函數名稱

# 本例僅作為::的說明使用, 不加上::運算子亦可執行
graphics::plot(as.ts(iris[-5]), main="")


程式碼

# ?問號
?plot
help(plot)
?'plot'
?"plot"
?'+'

# <-運算子
# 隨機選取1~49的6個數值
lotto <- sample(49,6)
lotto

# $符號
# 取出iris資料集的Species欄位資料, 其結果為向量
iris$Species

# () 小括號
readLines(system.file("DESCRIPTION"))
summary(iris)
plot(faithful)

# []中括號
# Species為setosa的Sepal.Length資料
iris$Sepal.Length[iris$Species == "setosa"]

# 符合Sepal.Length大於5且Sepal.Width大於4的所有資料
iris[iris$Sepal.Length >5 & iris$Sepal.Width > 4,]

# 讀取iris第1至4欄資料
iris[1:4]

# {}大括號
# 套件名稱
# plot {graphics}

# 程式區塊
for (i in 1:10) {
  if (i %% 2 == 0) {
    print(paste0(i, "是偶數"))
  } else {
    print(paste0(i, "是奇數"))
  }
}

# [[ 串列
list("RWEPA", c("R", "Python", "Julia"))
mylist <- list(web="RWEPA", programming=c("R", "Python", "Julia"))
mylist$programming
mylist[[2]]

10 則留言:

  1. 大括號的部分還不慎理解 例如 40行的 } else {
    另外38行的%%是什麼意思呢?

    回覆刪除
    回覆
    1. 第40行:
      else 表示 if (i %% 2 == 0) 的結果為FALSE時,
      則執行 print(paste0(i, "是奇數"))

      第38行:
      %% 表示計算餘數

      刪除
  2. 另,請問 "~" 在R中的意思為何?

    回覆刪除
    回覆
    1. # ~ 符號可用於線性模型lm , 例: dependent variable ~ independent variables
      carsLinerModel <- lm(dist ~ speed, data = cars)
      carsLinerModel

      # ~ 符號可用於aggregate函數, 計算變數 ~ 群組變數
      # 以下範例, 依Type為群組, 計算 Price 的群組平均值
      data(Cars93, package = "MASS")
      aggregate(Price ~ Type, data = Cars93, FUN = mean)

      刪除
  3. 請問[c(62,830), "fare"][[1]][1] 要怎麼讀這個式子

    回覆刪除
    回覆
    1. Hi friend,

      參考以下範例, 運算子的解析與輸入的資料物件有關係, 考慮資料框物件.

      data(titanic_train, package = "titanic")
      titanic_train[c(62,830), "Fare"] # 結果為向量,元素長度為2.
      titanic_train[c(62,830), "Fare"][[1]] # 因上個步驟結果為向量, 使用串列 list [[ ]]的用法取出第1個元素, 本例結果為一個元素.
      titanic_train[c(62,830), "Fare"][[1]][1] # 結果為1個元素向量的第1個元素, 結果為80.
      # end

      刪除
  4. pt_unmatch[, .(mean_age = mean(age),prop_male = mean(male) * 100,prop_hsk = mean(hsk) * 100),by = .(bed_day_7)]可以請教一下為什麼要打
    .()嗎?

    回覆刪除
    回覆
    1. Hi friend, pt_unmatch 不知是什麼套件的函數. 如果方便, 請提供套件名稱, R中應該沒有 .( ) 函數或參數用法吧!

      刪除