加減乘除

1+3       ## 一般加法
## [1] 4
34-123    ## 一般減法
## [1] -89
434*556   ## 一般乘法
## [1] 241304
325/3   ## 一般除法
## [1] 108.3333
325%/%3  ## 只取整數部分
## [1] 108
325%%3   ## 只取餘數部分
## [1] 1
x1<-1:25            ## 產生向量x1=(1,2,3,4,...,25)
x2<-c(1:25) 
x1==x2              ##判斷是否相同
##  [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [16] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
x<-c(11,12,13)
y<-c(2,5,3)
x+y       ##  向量相加
## [1] 13 17 16
x-y       ##  向量相減
## [1]  9  7 10
x*y       ##  向量相乘
## [1] 22 60 39
x/y       ##  向量相除?(其實是相對應分量相除)
## [1] 5.500000 2.400000 4.333333
x%*%x     ##  向量內積(分量相乘並加總)
##      [,1]
## [1,]  434
x%%x      ##  分量相除取餘數部分
## [1] 0 0 0
x%%y      ##  分量相除取餘數部分
## [1] 1 2 1
x%/%y     ##  分量相除取整數部分
## [1] 5 2 4
z<-c(1,2,3,4,5)
x/z       ##  查看結果與警告
## Warning in x/z: 較長的物件長度並非較短物件長度的倍數
## [1] 11.000000  6.000000  4.333333  2.750000  2.400000

序列 (sequence,指令用 seq)

seq(from=1, to=9, by=2) 
## [1] 1 3 5 7 9
seq(1,9,2)  ## 與上面效果一樣
## [1] 1 3 5 7 9
seq(5, -5, -1)
##  [1]  5  4  3  2  1  0 -1 -2 -3 -4 -5
x<-8
seq(1,x^2,x)   ## 執行到哪裡?
## [1]  1  9 17 25 33 41 49 57

重複 (repeat,指令用 rep)

rep(2,10)                       ## 2 重複產生 10 個
##  [1] 2 2 2 2 2 2 2 2 2 2
rep(c(2,3,4),5)                 ## 2,3,4 重複產生 5 次
##  [1] 2 3 4 2 3 4 2 3 4 2 3 4 2 3 4
x3<-c(1,1,1,2,2,2,2,3,3,3,3,3)
x4<-rep(c(1,2,3),c(3,4,5))
x3==x4  ##判斷是否相同
##  [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE

變數移除(remove)

rm(x3)
# x3 (此時執行x3會出錯)

資料類型(class)

v<-3L                           ## 指定一個整數
w<-c("你","好")
x<-c(1,2,3,4,5)
y<-matrix(1:9,ncol=3,byrow=T)
z<-list(w,x,y)

class(v)
## [1] "integer"
class(w)
## [1] "character"
class(x)
## [1] "numeric"
class(y)
## [1] "matrix" "array"
class(z)
## [1] "list"
is.numeric(v)
## [1] TRUE
is.numeric(y)
## [1] TRUE
is.numeric(z)
## [1] FALSE

日期(你活了幾天? 幾秒? 1970-01-01 00:00.00 UTC)

date1<-as.Date("2017-03-20")
date2<-as.Date("1998-08-24")
as.numeric(date1-date2)
## [1] 6783
as.numeric(date1)-as.numeric(date2)
## [1] 6783
date3<-as.POSIXct("2017-03-20 11:05")
date4<-as.POSIXct("1998-08-24 20:14")
as.numeric(date3-date4)
## [1] 6782.619
as.numeric(date3)-as.numeric(date4)
## [1] 586018260

絕對值(Absolute value)

abs(-125)
## [1] 125

平方根(Square root)

sqrt(64)
## [1] 8

(向上取整)取最接近且大於等於的整數

ceiling(5.15)
## [1] 6

(向下取整)取最接近且小於等於的整數,對於小數點後有值的數,相當於無條件捨去小數的部分

floor(3.17) 
## [1] 3

四捨五入,小數的部分設定位數

round(103.1415926, digits=2)  ## 取到小數點後2位
## [1] 103.14
round(103.1415926, digits=0)  ## 取到整數位
## [1] 103
round(103.1415926, digits=-1)  ## 取到十位數字
## [1] 100

無條件捨去小數的部分

trunc(54.625)
## [1] 54

比較一下正負值的處理

xx<-c(14.56,15.18,-12.34,-13.98)
ceiling(xx)
## [1]  15  16 -12 -13
floor(xx) 
## [1]  14  15 -13 -14
trunc(xx)
## [1]  14  15 -12 -13

character 和 factor

x <- "news"
x
## [1] "news"
y <- factor("news")
y                        ## 沒有括號,但包含 levels 訊息
## [1] news
## Levels: news
nchar(x)                 ## 長度
## [1] 4
nchar("hello")
## [1] 5
nchar(1)
## [1] 1
nchar(1999)
## [1] 4
# nchar(y)                 ## factor 不適用,若執行會出現錯誤訊息

邏輯

2 > 3
## [1] FALSE
15 < 15.01
## [1] TRUE
TRUE*100                 ## 以數值表示,TRUE等同1 
## [1] 100
FALSE*100
## [1] 0
# 2=3                    ## (寫法)錯誤!
2==3                     ## 比較是否相等
## [1] FALSE
2!=3                     ## 比較是否不相等
## [1] TRUE
"age"=="ages"
## [1] FALSE
"date"<"class"
## [1] FALSE
"date"<"glass"
## [1] TRUE

向量與其他運用

x <- c(1, 3, 5, 7, 9, 11, 13, 15)
x
## [1]  1  3  5  7  9 11 13 15
x * 3
## [1]  3  9 15 21 27 33 39 45
x + 4
## [1]  5  7  9 11 13 15 17 19
x - 5
## [1] -4 -2  0  2  4  6  8 10
x/4
## [1] 0.25 0.75 1.25 1.75 2.25 2.75 3.25 3.75
x^2
## [1]   1   9  25  49  81 121 169 225
x*x
## [1]   1   9  25  49  81 121 169 225
sqrt(x)
## [1] 1.000000 1.732051 2.236068 2.645751 3.000000 3.316625 3.605551 3.872983
1:20
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
20:1
##  [1] 20 19 18 17 16 15 14 13 12 11 10  9  8  7  6  5  4  3  2  1
-5:15
##  [1] -5 -4 -3 -2 -1  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
5:-15
##  [1]   5   4   3   2   1   0  -1  -2  -3  -4  -5  -6  -7  -8  -9 -10 -11 -12 -13
## [20] -14 -15
# 製造兩個同長度的向量

x <- 1:20
y <- -4:15

# 把它們做加減乘

x + y
##  [1] -3 -1  1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35
x - y
##  [1] 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5
x * y
##  [1]  -4  -6  -6  -4   0   6  14  24  36  50  66  84 104 126 150 176 204 234 266
## [20] 300
# 一個向量除另一個向量—注意到除以0會得到Inf為結果

x/y
##  [1] -0.2500000 -0.6666667 -1.5000000 -4.0000000        Inf  6.0000000
##  [7]  3.5000000  2.6666667  2.2500000  2.0000000  1.8333333  1.7142857
## [13]  1.6250000  1.5555556  1.5000000  1.4545455  1.4166667  1.3846154
## [19]  1.3571429  1.3333333
# 一個向量成為另一個的指數

x^y
##  [1] 1.000000e+00 1.250000e-01 1.111111e-01 2.500000e-01 1.000000e+00
##  [6] 6.000000e+00 4.900000e+01 5.120000e+02 6.561000e+03 1.000000e+05
## [11] 1.771561e+06 3.583181e+07 8.157307e+08 2.066105e+10 5.766504e+11
## [16] 1.759219e+13 5.826222e+14 2.082296e+16 7.990067e+17 3.276800e+19
# 查看每個向量的長度

length(x)
## [1] 20
length(y)
## [1] 20
# 把它們加起來之後的長度應該等於未加之前的長度

length(x + y)
## [1] 20
# 觀察一下長度不同的向量如何相加

x
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
x + c(1, 2)
##  [1]  2  4  4  6  6  8  8 10 10 12 12 14 14 16 16 18 18 20 20 22
x + c(1, 2, 3)
## Warning in x + c(1, 2, 3): 較長的物件長度並非較短物件長度的倍數
##  [1]  2  4  6  5  7  9  8 10 12 11 13 15 14 16 18 17 19 21 20 22
# 向量的邏輯

x
##  [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
y
##  [1] -4 -3 -2 -1  0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15
x <= 5
##  [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
x > y
##  [1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
## [16] TRUE TRUE TRUE TRUE TRUE
x < y
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [13] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
x <- 20:1
y <- -4:15
any(x < y)
## [1] TRUE
all(x < y)
## [1] FALSE
# 字串構成的向量與數值向量的比較

q <- c("Handball", "Football", "Baseball", "Sprint", "Discus",
       "Javelin", "Basketball", "Tennis", "Volleyball", "Soccer")
y <- -4:15
x <- 10:1
nchar(q)               # 有多少字元
##  [1]  8  8  8  6  6  7 10  6 10  6
nchar(y)
##  [1] 2 2 2 2 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2
nchar(x)
##  [1] 2 1 1 1 1 1 1 1 1 1
# 查看(取出)向量裡的元素  

x[1]
## [1] 10
x[1:2]
## [1] 10  9
x[c(1, 4)]
## [1] 10  7
q[1]
## [1] "Handball"
q[1:2]
## [1] "Handball" "Football"
q[c(1, 4)]
## [1] "Handball" "Sprint"
x[12]                 # 找不到,顯示 NA
## [1] NA
q[11]                 # 找不到,顯示 NA
## [1] NA

命名

# 用”名字-值”的方法對一排列的元素命名

c(One = "a", Two = "y", Last = "r")
##  One  Two Last 
##  "a"  "y"  "r"
# 建立vector

x <- 1:3

# 為vector元素名命

names(x) <- c("a", "b", "c")
x
## a b c 
## 1 2 3

因子(factor)

q <- c("Handball", "Football", "Baseball", "Sprint", "Discus",
       "Javelin", "Basketball", "Tennis", "Volleyball", "Soccer")

# 將向量轉成factor

q.Factor <- as.factor(q)
q.Factor  # 可看出factor 有 levels,即變數中不重複的元素個數
##  [1] Handball   Football   Baseball   Sprint     Discus     Javelin   
##  [7] Basketball Tennis     Volleyball Soccer    
## 10 Levels: Baseball Basketball Discus Football Handball Javelin ... Volleyball
# 將 factor 再轉成 數值

as.numeric(q.Factor)   # 結果按英文字母順序依次排序
##  [1]  5  4  1  8  3  6  2  9 10  7
# 建立一個排序後的 factor

factor(x=c("High School", "College", "Masters", "Doctorate"),
       levels=c("High School", "College", "Masters", "Doctorate"),
       ordered=TRUE)
## [1] High School College     Masters     Doctorate  
## Levels: High School < College < Masters < Doctorate

查詢

?`+`
## 開啟 httpd 求助伺服器… 好了
?`*`
?`==`

apropos("mea")  # 查詢所有包含 "mea" 字串之指令
##  [1] ".colMeans"          ".rowMeans"          "colMeans"          
##  [4] "influence.measures" "kmeans"             "mean"              
##  [7] "mean.Date"          "mean.default"       "mean.difftime"     
## [10] "mean.POSIXct"       "mean.POSIXlt"       "rowMeans"          
## [13] "weighted.mean"

遺失值

z <- c(1, 2, NA, 8, 3, NA, 3)
z                      # NA 會被向量視作是一個元素
## [1]  1  2 NA  8  3 NA  3
is.na(z)
## [1] FALSE FALSE  TRUE FALSE FALSE  TRUE FALSE
zChar <- c("Hockey", NA, "Lacrosse")
zChar
## [1] "Hockey"   NA         "Lacrosse"
is.na(zChar)
## [1] FALSE  TRUE FALSE
z <- c(1, NULL, 3)     # NULL 指不存在,放在向量裡會自動消失
z
## [1] 1 3
d <- NULL
is.null(d)
## [1] TRUE
is.null(7)
## [1] FALSE

資料型態

data.frame 資料框

q <- c("Handball", "Football", "Baseball", "Sprint", "Discus",
       "Javelin", "Basketball", "Tennis", "Volleyball", "Soccer")
y <- -4:5
x <- 10:1

theDF <- data.frame(x, y, q)
theDF
##     x  y          q
## 1  10 -4   Handball
## 2   9 -3   Football
## 3   8 -2   Baseball
## 4   7 -1     Sprint
## 5   6  0     Discus
## 6   5  1    Javelin
## 7   4  2 Basketball
## 8   3  3     Tennis
## 9   2  4 Volleyball
## 10  1  5     Soccer
theDF <- data.frame(First = x, Second = y, Sport = q)
theDF
##    First Second      Sport
## 1     10     -4   Handball
## 2      9     -3   Football
## 3      8     -2   Baseball
## 4      7     -1     Sprint
## 5      6      0     Discus
## 6      5      1    Javelin
## 7      4      2 Basketball
## 8      3      3     Tennis
## 9      2      4 Volleyball
## 10     1      5     Soccer
nrow(theDF)
## [1] 10
ncol(theDF)
## [1] 3
dim(theDF)
## [1] 10  3
names(theDF)
## [1] "First"  "Second" "Sport"
names(theDF)[3]
## [1] "Sport"
rownames(theDF)
##  [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"
rownames(theDF) <- c("One", "Two", "Three", "Four", "Five", "Six",
                     "Seven", "Eight", "Nine", "Ten")
rownames(theDF)
##  [1] "One"   "Two"   "Three" "Four"  "Five"  "Six"   "Seven" "Eight" "Nine" 
## [10] "Ten"
# 設回通用的標註(index)
rownames(theDF) <- NULL
rownames(theDF)
##  [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10"
head(theDF)             # 預設會印出頭6筆,資料多筆時很有用
##   First Second    Sport
## 1    10     -4 Handball
## 2     9     -3 Football
## 3     8     -2 Baseball
## 4     7     -1   Sprint
## 5     6      0   Discus
## 6     5      1  Javelin
head(theDF, n = 7)      # 印出頭7筆
##   First Second      Sport
## 1    10     -4   Handball
## 2     9     -3   Football
## 3     8     -2   Baseball
## 4     7     -1     Sprint
## 5     6      0     Discus
## 6     5      1    Javelin
## 7     4      2 Basketball
tail(theDF)             # 預設會印出末6筆,資料多筆時很有用
##    First Second      Sport
## 5      6      0     Discus
## 6      5      1    Javelin
## 7      4      2 Basketball
## 8      3      3     Tennis
## 9      2      4 Volleyball
## 10     1      5     Soccer
class(theDF)
## [1] "data.frame"
theDF$Sport
##  [1] "Handball"   "Football"   "Baseball"   "Sprint"     "Discus"    
##  [6] "Javelin"    "Basketball" "Tennis"     "Volleyball" "Soccer"
theDF[3, 2]            
## [1] -2
# 第三橫排,第二到第三直排
theDF[3, 2:3]
##   Second    Sport
## 3     -2 Baseball
# 第二直排,第三和第五橫排
# 由於只選了一個直排,其將回傳一個向量(vector)
# 因此直排名稱將不被顯示
theDF[c(3, 5), 2]
## [1] -2  0
# 第二和第五橫排,第二到四直排,因為只有三直排,執行會出錯
# theDF[c(2, 5), 2:4]

# 所有第三直排的元素
# 由於只是單一直排,因此回傳一個向量(vector)
theDF[, 3]
##  [1] "Handball"   "Football"   "Baseball"   "Sprint"     "Discus"    
##  [6] "Javelin"    "Basketball" "Tennis"     "Volleyball" "Soccer"
# 所有第二到第三直排的元素
theDF[, 2:3]
##    Second      Sport
## 1      -4   Handball
## 2      -3   Football
## 3      -2   Baseball
## 4      -1     Sprint
## 5       0     Discus
## 6       1    Javelin
## 7       2 Basketball
## 8       3     Tennis
## 9       4 Volleyball
## 10      5     Soccer
# 所有第二橫排的元素
theDF[2, ]
##   First Second    Sport
## 2     9     -3 Football
# 所有第二到第四橫排的元素
theDF[2:4, ]
##   First Second    Sport
## 2     9     -3 Football
## 3     8     -2 Baseball
## 4     7     -1   Sprint
theDF[, c("First", "Sport")]
##    First      Sport
## 1     10   Handball
## 2      9   Football
## 3      8   Baseball
## 4      7     Sprint
## 5      6     Discus
## 6      5    Javelin
## 7      4 Basketball
## 8      3     Tennis
## 9      2 Volleyball
## 10     1     Soccer
# 只顯示"Sport"直排
# 只有單一個直排,所以回傳一個向量vector(且為因素,factor)
theDF[, "Sport"]
##  [1] "Handball"   "Football"   "Baseball"   "Sprint"     "Discus"    
##  [6] "Javelin"    "Basketball" "Tennis"     "Volleyball" "Soccer"
class(theDF[, "Sport"])
## [1] "character"
# 只指定顯示"Sport"直排
# 回傳單一直排的data.frame
theDF["Sport"]
##         Sport
## 1    Handball
## 2    Football
## 3    Baseball
## 4      Sprint
## 5      Discus
## 6     Javelin
## 7  Basketball
## 8      Tennis
## 9  Volleyball
## 10     Soccer
class(theDF["Sport"])
## [1] "data.frame"
# 只顯示"Sport"直排
# 此也vector(且為因素,factor)
theDF[["Sport"]]
##  [1] "Handball"   "Football"   "Baseball"   "Sprint"     "Discus"    
##  [6] "Javelin"    "Basketball" "Tennis"     "Volleyball" "Soccer"
class(theDF[["Sport"]])
## [1] "character"
# 用 drop = FALSE 保證回傳的是單一行的 data.frame
theDF[, "Sport", drop = FALSE]
##         Sport
## 1    Handball
## 2    Football
## 3    Baseball
## 4      Sprint
## 5      Discus
## 6     Javelin
## 7  Basketball
## 8      Tennis
## 9  Volleyball
## 10     Soccer
class(theDF[, "Sport", drop = FALSE])
## [1] "data.frame"
theDF[, 3, drop = FALSE]
##         Sport
## 1    Handball
## 2    Football
## 3    Baseball
## 4      Sprint
## 5      Discus
## 6     Javelin
## 7  Basketball
## 8      Tennis
## 9  Volleyball
## 10     Soccer
class(theDF[, 3, drop = FALSE])
## [1] "data.frame"

list

# 建立一個五個元素的list
list(1, 2, 3, 4, 5)
## [[1]]
## [1] 1
## 
## [[2]]
## [1] 2
## 
## [[3]]
## [1] 3
## 
## [[4]]
## [1] 4
## 
## [[5]]
## [1] 5
# 建立一個元素的list,且其唯一元素為一個含有四個元素的vector
list(c(1, 2, 3 , 4))
## [[1]]
## [1] 1 2 3 4
# 建立兩個元素的list
# 第一個元素為含有五個元素的vector
# 第二個元素為含有五個元素的vector
(list3 <- list(c(1, 2, 3, 4, 5), 5:9))
## [[1]]
## [1] 1 2 3 4 5
## 
## [[2]]
## [1] 5 6 7 8 9
# 兩個元素的list
# 第一元素為 data.frame
# 第二元素為含有10個元素的vector
list(theDF, 1:10)
## [[1]]
##    First Second      Sport
## 1     10     -4   Handball
## 2      9     -3   Football
## 3      8     -2   Baseball
## 4      7     -1     Sprint
## 5      6      0     Discus
## 6      5      1    Javelin
## 7      4      2 Basketball
## 8      3      3     Tennis
## 9      2      4 Volleyball
## 10     1      5     Soccer
## 
## [[2]]
##  [1]  1  2  3  4  5  6  7  8  9 10
# 三個元素的list
# 第一個為data.frame
# 第二個為vector
# 第三個為含有兩個vector的list,名為list3
list5 <- list(theDF, 1:10, list3)
list5
## [[1]]
##    First Second      Sport
## 1     10     -4   Handball
## 2      9     -3   Football
## 3      8     -2   Baseball
## 4      7     -1     Sprint
## 5      6      0     Discus
## 6      5      1    Javelin
## 7      4      2 Basketball
## 8      3      3     Tennis
## 9      2      4 Volleyball
## 10     1      5     Soccer
## 
## [[2]]
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## [[3]]
## [[3]][[1]]
## [1] 1 2 3 4 5
## 
## [[3]][[2]]
## [1] 5 6 7 8 9
names(list5)
## NULL
names(list5) <- c("data.frame", "vector", "list")   # list 可以被命名
names(list5)
## [1] "data.frame" "vector"     "list"
list5
## $data.frame
##    First Second      Sport
## 1     10     -4   Handball
## 2      9     -3   Football
## 3      8     -2   Baseball
## 4      7     -1     Sprint
## 5      6      0     Discus
## 6      5      1    Javelin
## 7      4      2 Basketball
## 8      3      3     Tennis
## 9      2      4 Volleyball
## 10     1      5     Soccer
## 
## $vector
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## $list
## $list[[1]]
## [1] 1 2 3 4 5
## 
## $list[[2]]
## [1] 5 6 7 8 9
# 亦可在建立list時以"名稱-值"的形式指派元素的名字
list6 <- list(TheDataFrame = theDF, TheVector = 1:10, TheList = list3)
names(list6)
## [1] "TheDataFrame" "TheVector"    "TheList"
list6
## $TheDataFrame
##    First Second      Sport
## 1     10     -4   Handball
## 2      9     -3   Football
## 3      8     -2   Baseball
## 4      7     -1     Sprint
## 5      6      0     Discus
## 6      5      1    Javelin
## 7      4      2 Basketball
## 8      3      3     Tennis
## 9      2      4 Volleyball
## 10     1      5     Soccer
## 
## $TheVector
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## $TheList
## $TheList[[1]]
## [1] 1 2 3 4 5
## 
## $TheList[[2]]
## [1] 5 6 7 8 9
# 可以用vector來建立某長度的空list(勿與之前vector的用法混淆)
(emptyList <- vector(mode = "list", length = 4))
## [[1]]
## NULL
## 
## [[2]]
## NULL
## 
## [[3]]
## NULL
## 
## [[4]]
## NULL
# 查詢list中的單一元素可用雙中括號,並指定要查詢元素所對應的號碼(位置或索引)或名稱
list5[[1]]
##    First Second      Sport
## 1     10     -4   Handball
## 2      9     -3   Football
## 3      8     -2   Baseball
## 4      7     -1     Sprint
## 5      6      0     Discus
## 6      5      1    Javelin
## 7      4      2 Basketball
## 8      3      3     Tennis
## 9      2      4 Volleyball
## 10     1      5     Soccer
list5[["data.frame"]]
##    First Second      Sport
## 1     10     -4   Handball
## 2      9     -3   Football
## 3      8     -2   Baseball
## 4      7     -1     Sprint
## 5      6      0     Discus
## 6      5      1    Javelin
## 7      4      2 Basketball
## 8      3      3     Tennis
## 9      2      4 Volleyball
## 10     1      5     Soccer
# 以上述方式查詢到的元素可當作一般元素使用,透過巢狀索引(nested indexing)的標示方式,進一步查其中的元素
list5[[1]]$Sport
##  [1] "Handball"   "Football"   "Baseball"   "Sprint"     "Discus"    
##  [6] "Javelin"    "Basketball" "Tennis"     "Volleyball" "Soccer"
list5[[1]][, "Second"]
##  [1] -4 -3 -2 -1  0  1  2  3  4  5
list5[[1]][, "Second", drop = FALSE]
##    Second
## 1      -4
## 2      -3
## 3      -2
## 4      -1
## 5       0
## 6       1
## 7       2
## 8       3
## 9       4
## 10      5
# 勘查其長度
length(list5)
## [1] 3
# 附加第四個元素,並不給予名稱
list5[[4]] <- 2
length(list5)
## [1] 4
# 附加第五個元素,並給予名稱
list5[["NewElement"]] <- 3:6
length(list5)
## [1] 5
names(list5)
## [1] "data.frame" "vector"     "list"       ""           "NewElement"
list5
## $data.frame
##    First Second      Sport
## 1     10     -4   Handball
## 2      9     -3   Football
## 3      8     -2   Baseball
## 4      7     -1     Sprint
## 5      6      0     Discus
## 6      5      1    Javelin
## 7      4      2 Basketball
## 8      3      3     Tennis
## 9      2      4 Volleyball
## 10     1      5     Soccer
## 
## $vector
##  [1]  1  2  3  4  5  6  7  8  9 10
## 
## $list
## $list[[1]]
## [1] 1 2 3 4 5
## 
## $list[[2]]
## [1] 5 6 7 8 9
## 
## 
## [[4]]
## [1] 2
## 
## $NewElement
## [1] 3 4 5 6

array (陣列,多維度的vector,元素必須皆為同一資料型態,可以是任何維度)

theArray <- array(1:12, dim = c(2, 3, 2))
theArray
## , , 1
## 
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
## 
## , , 2
## 
##      [,1] [,2] [,3]
## [1,]    7    9   11
## [2,]    8   10   12
theArray[1, , ]
##      [,1] [,2]
## [1,]    1    7
## [2,]    3    9
## [3,]    5   11
theArray[1, , 1]
## [1] 1 3 5
theArray[, , 1]
##      [,1] [,2] [,3]
## [1,]    1    3    5
## [2,]    2    4    6
theArray1 <- array(LETTERS[1:12], dim = c(2, 3, 2))
theArray1[2,3,2]
## [1] "L"
theArray1[2,2,2]
## [1] "J"

矩陣(元素必須皆為同一資料型態,最常見的是numeric,只有兩個維度)

# 建立一個5x2 matrix
A <- matrix(1:10, nrow = 5)

# 建立另一個5x2 matrix
B <- matrix(1:10, nrow = 5, byrow=T)

# 建立另一個2x10 matrix
C <- matrix(21:40, nrow = 2)

A
##      [,1] [,2]
## [1,]    1    6
## [2,]    2    7
## [3,]    3    8
## [4,]    4    9
## [5,]    5   10
B
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6
## [4,]    7    8
## [5,]    9   10
C
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,]   21   23   25   27   29   31   33   35   37    39
## [2,]   22   24   26   28   30   32   34   36   38    40
nrow(A)
## [1] 5
ncol(A)
## [1] 2
dim(A)
## [1] 5 2
# 把它們加起來
A + B
##      [,1] [,2]
## [1,]    2    8
## [2,]    5   11
## [3,]    8   14
## [4,]   11   17
## [5,]   14   20
# 把它們互相乘起來(相對應元素相乘,非矩陣乘法)
A * B
##      [,1] [,2]
## [1,]    1   12
## [2,]    6   28
## [3,]   15   48
## [4,]   28   72
## [5,]   45  100
# 勘查元素是否一樣
A == B
##       [,1]  [,2]
## [1,]  TRUE FALSE
## [2,] FALSE FALSE
## [3,] FALSE FALSE
## [4,] FALSE FALSE
## [5,] FALSE  TRUE
# 矩陣的轉置
(t(B))
##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    3    5    7    9
## [2,]    2    4    6    8   10
# 矩陣乘法 (B轉置後2x5,本例為5x2 %*% 2x5)
A %*% t(B)
##      [,1] [,2] [,3] [,4] [,5]
## [1,]   13   27   41   55   69
## [2,]   16   34   52   70   88
## [3,]   19   41   63   85  107
## [4,]   22   48   74  100  126
## [5,]   25   55   85  115  145
# 欄與列的命名
A
##      [,1] [,2]
## [1,]    1    6
## [2,]    2    7
## [3,]    3    8
## [4,]    4    9
## [5,]    5   10
colnames(A)
## NULL
rownames(A)
## NULL
colnames(A) <- c("Left", "Right")
rownames(A) <- c("1st", "2nd", "3rd", "4th", "5th")
A
##     Left Right
## 1st    1     6
## 2nd    2     7
## 3rd    3     8
## 4th    4     9
## 5th    5    10
B
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
## [3,]    5    6
## [4,]    7    8
## [5,]    9   10
colnames(B)
## NULL
rownames(B)
## NULL
colnames(B) <- c("First", "Second")
rownames(B) <- c("One", "Two", "Three", "Four", "Five")
B
##       First Second
## One       1      2
## Two       3      4
## Three     5      6
## Four      7      8
## Five      9     10
C
##      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,]   21   23   25   27   29   31   33   35   37    39
## [2,]   22   24   26   28   30   32   34   36   38    40
colnames(C)
## NULL
rownames(C)
## NULL
colnames(C) <- LETTERS[1:10]
rownames(C) <- c("Top", "Bottom")
C
##         A  B  C  D  E  F  G  H  I  J
## Top    21 23 25 27 29 31 33 35 37 39
## Bottom 22 24 26 28 30 32 34 36 38 40
# 轉置和矩陣相乘對名稱的影響
A
##     Left Right
## 1st    1     6
## 2nd    2     7
## 3rd    3     8
## 4th    4     9
## 5th    5    10
t(A)
##       1st 2nd 3rd 4th 5th
## Left    1   2   3   4   5
## Right   6   7   8   9  10
C
##         A  B  C  D  E  F  G  H  I  J
## Top    21 23 25 27 29 31 33 35 37 39
## Bottom 22 24 26 28 30 32 34 36 38 40
A %*% C
##       A   B   C   D   E   F   G   H   I   J
## 1st 153 167 181 195 209 223 237 251 265 279
## 2nd 196 214 232 250 268 286 304 322 340 358
## 3rd 239 261 283 305 327 349 371 393 415 437
## 4th 282 308 334 360 386 412 438 464 490 516
## 5th 325 355 385 415 445 475 505 535 565 595
# 較多元素矩陣乘法之範例
X<-matrix(1:100,nrow=10,byrow=T)
Y<-matrix(seq(from=-99, to=99, by=2) ,nrow=10)
X%*%Y
##         [,1]   [,2]   [,3]   [,4]  [,5] [,6]  [,7]  [,8]  [,9] [,10]
##  [1,]  -4785  -3685  -2585  -1485  -385  715  1815  2915  4015  5115
##  [2,] -13785 -10685  -7585  -4485 -1385 1715  4815  7915 11015 14115
##  [3,] -22785 -17685 -12585  -7485 -2385 2715  7815 12915 18015 23115
##  [4,] -31785 -24685 -17585 -10485 -3385 3715 10815 17915 25015 32115
##  [5,] -40785 -31685 -22585 -13485 -4385 4715 13815 22915 32015 41115
##  [6,] -49785 -38685 -27585 -16485 -5385 5715 16815 27915 39015 50115
##  [7,] -58785 -45685 -32585 -19485 -6385 6715 19815 32915 46015 59115
##  [8,] -67785 -52685 -37585 -22485 -7385 7715 22815 37915 53015 68115
##  [9,] -76785 -59685 -42585 -25485 -8385 8715 25815 42915 60015 77115
## [10,] -85785 -66685 -47585 -28485 -9385 9715 28815 47915 67015 86115
# 求反矩陣
# solve(X)   # 若為奇異矩陣,不存在反矩陣,故執行會出錯
det(X)     # 求行列式
## [1] 3.49659e-113
W<-matrix(c(1,3,4,5,2,6,3,8,9),nrow=3)
W
##      [,1] [,2] [,3]
## [1,]    1    5    3
## [2,]    3    2    8
## [3,]    4    6    9
det(W)     # 求行列式
## [1] 25
solve(W)   # 可求得反矩陣
##      [,1]  [,2]  [,3]
## [1,] -1.2 -1.08  1.36
## [2,]  0.2 -0.12  0.04
## [3,]  0.4  0.56 -0.52