R 常用指令

## 加減乘除

1+3       ## 一般加法
34-123    ## 一般減法
434*556   ## 一般乘法

325/3   ## 一般除法
325%/%3  ## 只取整數部分
325%%3   ## 只取餘數部分


x1<-1:25            ## 產生向量x1=(1,2,3,4,...,25)
x2<-c(1:25) 
x1==x2              ##判斷是否相同


x<-c(11,12,13)
y<-c(2,5,3)
x+y       ##  向量相加
x-y       ##  向量相減
x*y       ##  向量相乘
x/y       ##  向量相除?(其實是相對應分量相除)

x%*%x     ##  向量內積(分量相乘並加總)
x%%x      ##  分量相除取餘數部分
x%%y      ##  分量相除取餘數部分
x%/%y     ##  分量相除取整數部分

z<-c(1,2,3,4,5)
x/z       ##  查看結果與警告


## 序列 (sequence,指令用 seq)

seq(from=1, to=9, by=2) 

seq(1,9,2)  ## 與上面效果一樣

seq(5, -5, -1)

x<-8
seq(1,x^2,x)   ## 執行到哪裡?



## 重複 (repeat,指令用 rep)

rep(2,10)                       ## 2 重複產生 10 個
rep(c(2,3,4),5)                 ## 2,3,4 重複產生 5 次

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  ##判斷是否相同


## 變數移除(remove)

rm(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)
class(w)
class(x)
class(y)
class(z)

is.numeric(v)
is.numeric(y)
is.numeric(z)


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

date1<-as.Date("2017-03-20")
date2<-as.Date("1998-08-24")
as.numeric(date1-date2)
as.numeric(date1)-as.numeric(date2)

date3<-as.POSIXct("2017-03-20 11:05")
date4<-as.POSIXct("1998-08-24 20:14")
as.numeric(date3-date4)
as.numeric(date3)-as.numeric(date4)


## 絕對值(Absolute value)
abs(-125)

## 平方根(Square root)
sqrt(64)

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

ceiling(5.15)

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

floor(3.17) 


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

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

## 無條件捨去小數的部分

trunc(54.625)

## 比較一下正負值的處理

xx<-c(14.56,15.18,-12.34,-13.98)
ceiling(xx)
floor(xx) 
trunc(xx)


## character 和 factor 

x<-"news"
x
y<-factor("news")
y                        ## 沒有括號,但包含 levels 訊息

nchar(x)                 ## 長度
nchar("hello")
nchar(1)
nchar(1999)

nchar(y)                 ## factor 不適用,出現錯誤訊息


## 邏輯

2 > 3
15 < 15.01
TRUE*100                 ## 以數值表示,TRUE等同1 
FALSE*100

2=3                      ## (寫法)錯誤!
2==3                     ## 比較是否相等
2!=3                     ## 比較是否不相等
"age"=="ages"
"date"<"class"
"date"<"glass"


##  向量其他運用


x <- c(1, 3, 5, 7, 9, 11, 13, 15)
x

x * 3
x + 4
x - 5
x/4
x^2
x*x
sqrt(x)

# 也可以依序產生

1:20
20:1
-5:15
5:-15

# 製造兩個同長度的向量

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

# 把它們做加減乘
x + y
x - y
x * y

# 一個向量除另一個向量—注意到除以0會得到Inf為結果
x/y

# 一個向量成為另一個的指數
x^y

# 查看每個向量的長度
length(x)
length(y)

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

# 觀察一下長度不同的向量如何相加
x
x + c(1, 2)
x + c(1, 2, 3)

# 向量的邏輯

x
y
x <= 5
x > y
x < y

x <- 20:1
y <- -4:15
any(x < y)
all(x < y)




# 字串構成的向量與數值向量的比較

q <- c("Handball", "Football", "Baseball", "Sprint", "Discus",
       "Javelin", "Basketball", "Tennis", "Volleyball", "Soccer")
y <- -4:15
x <- 10:1
nchar(q)               # 有多少字元
nchar(y)
nchar(x)

# 查看(取出)向量裡的元素  

x[1]
x[1:2]
x[c(1, 4)]
q[1]
q[1:2]
q[c(1, 4)]
x[12]                 # 找不到,顯示 NA
q[11]                 # 找不到,顯示 NA



## 命名

# 用”名字-值”的方法對一排列的元素命名
c(One = "a", Two = "y", Last = "r")

# 建立vector
x <- 1:3

# 為vector元素名命
names(x) <- c("a", "b", "c")
x


## 因素(factor)

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

# 將向量轉成factor

q.Factor <- as.factor(q)
q.Factor  # 可看出factor 有 levels,即變數中不重複的元素個數

# 將 factor 再轉成 數值

as.numeric(q.Factor)   # 結果按英文字母順序依次排序

# 建立一個排序後的 factor

factor(x=c("High School", "College", "Masters", "Doctorate"),
       levels=c("High School", "College", "Masters", "Doctorate"),
       ordered=TRUE)

## 查詢

?`+`
?`*`
?`==`

apropos("mea")  # 查詢所有包含 "mea" 字串之指令


## 遺失值

z <- c(1, 2, NA, 8, 3, NA, 3)
z                      # NA 會被向量視作是一個元素
is.na(z)

zChar <- c("Hockey", NA, "Lacrosse")
zChar
is.na(zChar)

z <- c(1, NULL, 3)     # NULL 指不存在,放在向量裡會自動消失
z

d <- NULL
is.null(d)
is.null(7)


### 資料型態

## 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

theDF <- data.frame(First = x, Second = y, Sport = q)
theDF

nrow(theDF)
ncol(theDF)
dim(theDF)

names(theDF)
names(theDF)[3]

rownames(theDF)
rownames(theDF) <- c("One", "Two", "Three", "Four", "Five", "Six",
                     "Seven", "Eight", "Nine", "Ten")
rownames(theDF)

# 設回通用的標註(index)
rownames(theDF) <- NULL
rownames(theDF)

head(theDF)             # 預設會印出頭6筆,資料多筆時很有用
head(theDF, n = 7)      # 印出頭7筆
tail(theDF)             # 預設會印出末6筆,資料多筆時很有用

class(theDF)

theDF$Sport

theDF[3, 2]            

# 第三橫排,第二到第三直排
theDF[3, 2:3]

# 第二直排,第三和第五橫排
# 由於只選了一個直排,其將回傳一個向量(vector)
# 因此直排名稱將不被顯示
theDF[c(3, 5), 2]

# 第二和第五橫排,第二到四直排
theDF[c(2, 5), 2:4]

# 所有第三直排的元素
# 由於只是單一直排,因此回傳一個向量(vector)
theDF[, 3]

# 所有第二到第三直排的元素
theDF[, 2:3]

# 所有第二橫排的元素
theDF[2, ]

# 所有第二到第四橫排的元素
theDF[2:4, ]


theDF[, c("First", "Sport")]

# 只顯示"Sport"直排
# 只有單一個直排,所以回傳一個向量vector(且為因素,factor)
theDF[, "Sport"]
class(theDF[, "Sport"])

# 只指定顯示"Sport"直排
# 回傳單一直排的data.frame
theDF["Sport"]
class(theDF["Sport"])

# 只顯示"Sport"直排
# 此也vector(且為因素,factor)
theDF[["Sport"]]
class(theDF[["Sport"]])

# 用 drop = FALSE 保證回傳的是單一行的 data.frame
theDF[, "Sport", drop = FALSE]
class(theDF[, "Sport", drop = FALSE])
theDF[, 3, drop = FALSE]
class(theDF[, 3, drop = FALSE])

## list

# 建立一個五個元素的list
list(1, 2, 3, 4, 5)

# 建立一個元素的list,且其唯一元素為一個含有四個元素的vector
list(c(1, 2, 3 , 4))

# 建立兩個元素的list
# 第一個元素為含有五個元素的vector
# 第二個元素為含有五個元素的vector
(list3 <- list(c(1, 2, 3, 4, 5), 5:9))

# 兩個元素的list
# 第一元素為 data.frame
# 第二元素為含有10個元素的vector
list(theDF, 1:10)

# 三個元素的list
# 第一個為data.frame
# 第二個為vector
# 第三個為含有兩個vector的list,名為list3
list5 <- list(theDF, 1:10, list3)
list5

names(list5)
names(list5) <- c("data.frame", "vector", "list")   # list 可以被命名
names(list5)
list5

# 亦可在建立list時以"名稱-值"的形式指派元素的名字
list6 <- list(TheDataFrame = theDF, TheVector = 1:10, TheList = list3)
names(list6)
list6

# 可以用vector來建立某長度的空list(勿與之前vector的用法混淆)
(emptyList <- vector(mode = "list", length = 4))

# 查詢list中的單一元素可用雙中括號,並指定要查詢元素所對應的號碼(位置或索引)或名稱
list5[[1]]
list5[["data.frame"]]

# 以上述方式查詢到的元素可當作一般元素使用,透過巢狀索引(nested indexing)的標示方式,進一步查其中的元素
list5[[1]]$Sport
list5[[1]][, "Second"]
list5[[1]][, "Second", drop = FALSE]

# 勘查其長度
length(list5)

# 附加第四個元素,並不給予名稱
list5[[4]] <- 2
length(list5)

# 附加第五個元素,並給予名稱
list5[["NewElement"]] <- 3:6
length(list5)
names(list5)
list5



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

theArray <- array(1:12, dim = c(2, 3, 2))
theArray
theArray[1, , ]
theArray[1, , 1]
theArray[, , 1]

theArray1 <- array(LETTERS[1:12], dim = c(2, 3, 2))
theArray1[2,3,2]
theArray1[2,2,2]



## 矩陣(元素必須皆為同一資料型態,最常見的是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
B
C

nrow(A)
ncol(A)
dim(A)

# 把它們加起來
A + B

# 把它們互相乘起來(相對應元素相乘,非矩陣乘法)
A * B

# 勘查元素是否一樣
A == B

# 矩陣的轉置
(t(B))

# 矩陣乘法 (B轉置後2x5,本例為5x2 %*% 2x5)
A %*% t(B)

# 欄與列的命名
A
colnames(A)
rownames(A)
colnames(A) <- c("Left", "Right")
rownames(A) <- c("1st", "2nd", "3rd", "4th", "5th")
A

B
colnames(B)
rownames(B)
colnames(B) <- c("First", "Second")
rownames(B) <- c("One", "Two", "Three", "Four", "Five")
B

C
colnames(C)
rownames(C)
colnames(C) <- LETTERS[1:10]
rownames(C) <- c("Top", "Bottom")
C

# 轉置和矩陣相乘對名稱的影響
A
t(A)
C
A %*% C

# 較多元素矩陣乘法之範例
X<-matrix(1:100,nrow=10,byrow=T)
Y<-matrix(seq(from=-99, to=99, by=2) ,nrow=10)
X%*%Y

# 求反矩陣
solve(X)   # 若為奇異矩陣,不存在反矩陣
det(X)     # 求行列式
W<-matrix(c(1,3,4,5,2,6,3,8,9),nrow=3)
W
det(W)     # 求行列式
solve(W)   # 可求得反矩陣




持續擴充

留言

熱門文章