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) # 可求得反矩陣
持續擴充
留言
張貼留言