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