R
[TOC]
安裝與調試
退出解釋器:q()
命令行運行:Rscript filename.R
基礎語法
變量與基礎操作
查看已定義的變量列表:ls()
print(ls())
刪除變量:rm()
rm(varname)
輸出結果拼接:cat()
用逗號分隔拼接部分
內容輸出到文件:cat(內容,file=“filepath”[,append=TRUE])
建議用絕對路徑, Windows 路徑格式為 D:\r_test.txt。
append表示追加寫入,不添加時為覆蓋
控制臺輸出到文件:sink("filepath"[,split=TRUE] [,append=TRUE])
split表示保留控制臺輸出。
默認是覆蓋寫入。
調用無參數sink()可以取消
從文件讀入文字:readLines("filepath")
獲取當前工作目錄 :getwd()
設置當前工作目錄: setwd()
整除與整除求余:%%,%/%。
優先級僅次于乘方和括號
冒號運算符/整數向量/向量運算相關: :
v <- 1:10
print(v)
輸出:1 2 3 4 5 6 7 8 9 10
判斷數字是否在向量v/向量運算相關:num %in% v
矩陣與它轉置的矩陣相乘/矩陣運算:M %*% t(M)
數學函數:
sqrt(n) | n的平方根 |
---|---|
exp(n) | 自然常數e的n次方, |
log(m,n) | m的對數函數,返回n的幾次方等于m |
log10(m) | 相當于log(m,10) |
round | (n) | 對 n 四舍五入取整 |
---|---|---|
(n, m) | 對 n 保留 m 位小數四舍五入 | |
ceiling | (n) | 對 n 向上取整 |
floor | (n) | 對 n 向下取整 |
NA與NULL
缺失,沒有值,但位置存在
數據不存在
向量
生成:a=c(l,r)。 可通過數組下標取用,從1開始。
可能有間隙的等差數列:seq(l,r,gap)
m到n的等差數列:seq(l,r,step)
重復數列:rep(num,重復次數)
> a = c(10, 20, 30, 40, 50)
> a[2]
[1] 20
> a[1:4] # 取出第 1 到 4 項,包含第 1 和第 4 項
[1] 10 20 30 40
> a[c(1, 3, 5)] # 取出第 1, 3, 5 項
[1] 10 30 50
> a[c(-1, -5)] # 去掉第 1 和第 5 項
[1] 20 30 40
可以對向量做標量運算、邏輯運算,效果是每個元素依次運算
排序:sort、rev(反向)、order(返回向量排序后的下標)、a[order(a)]輸出的是排序后的向量
統計學函數:
sum | 求和 |
---|---|
mean | 求平均值 |
var | 方差 |
sd | 標準差 |
min | 最小值 |
max | 最大值 |
range | 取值范圍(二維向量,最大值和最小值) |
篩選: (vector[which(vector >= a & vector < b)]
all\any。 all() 用于檢查邏輯向量是否全部為 TRUE,any() 用于檢查邏輯向量是否含有 TRUE。
字符串
> toupper("Runoob") # 轉換為大寫
[1] "RUNOOB"
> tolower("Runoob") # 轉換為小寫
[1] "runoob"
> nchar("中文", type="bytes") # 統計字節長度
[1] 4
> nchar("中文", type="char") # 總計字符數量
[1] 2
> substr("123456789", 1, 5) # 截取字符串,從 1 到 5
[1] "12345"
> substring("1234567890", 5) # 截取字符串,從 5 到結束
[1] "567890"
> as.numeric("12") # 將字符串轉換為數字
[1] 12
> as.character(12.34) # 將數字轉換為字符串
[1] "12.34"
> strsplit("2019;10;1", ";") # 分隔符拆分字符串
[[1]]
[1] "2019" "10" "1"
> gsub("/", "-", "2019/10/1") # 替換字符串
[1] "2019-10-1"
> print(paste(letters[1:6],1:6, sep = "", collapse = "="))
[1] "a1=b2=c3=d4=e5=f6" # 拼接,cpllapse是拼接的連接
> format(x, digits, nsmall, scientific, width, justify = c("left", "right", "centre", "none"))
# x : 輸入對向量
# digits : 顯示的位數
# nsmall : 小數點右邊顯示的最少位數
# scientific : 設置科學計數法
# width : 通過開頭填充空白來顯示最小的寬度
# justify:設置位置,顯示可以是左邊、右邊、中間等。
如果在 UTF-8 編碼的計算機上運行,單個中文字符的字節長度應該是 3。
列表,一種筐
創建: list_data <- list( )
命名: names(list_data) <- c("Sites", "Numbers", "Lists")
訪問: 1.按下標 2.按名字print(list_data$Name)
添加: list_data[最后一個下標+1] <- "新元素" 也可用于更新
刪除: list_data[4] <- NULL
合并: merged.list <- c(list1,list2)
列表轉向量: v1 <- unlist(list1)
矩陣
v=c() m= matrix(vector,行數,列數,byrow=,dimnames=) 向量會逐列填充,添加byrow為TRUE會按行填充,dimaname用于設置行列名
rownames = c("row1", "row2", "row3", "row4")
colnames = c("col1", "col2", "col3")
P <- matrix(c(3:14), nrow = 4, byrow = TRUE, dimnames = list(rownames, colnames))
查詢:按二維數組查詢
命名:行列都可以設定名稱:
> colnames(m1) = c("x", "y", "z")
> rownames(m1) = c("a", "b")
> m1
x y z
a 1 2 3
b 4 5 6
> m1["a", ]
x y z
1 2 3
矩陣乘法:
> m1 = matrix(c(1, 2), 1, 2)
> m2 = matrix(c(3, 4), 2, 1)
> m1 %*% m2
[,1]
[1,] 11
矩陣乘除:* / 按位逐個相互運算
逆矩陣:solve(A)
轉置矩陣:t()
矩陣分行分列計算: apply()。如apply(A, 1, sum)。參數為1按行操作,參數為2按列操作
數組
# 創建兩個不同長度的向量
vector1 <- c(5,9,3)
vector2 <- c(10,11,12,13,14,15)
column.names <- c("COL1","COL2","COL3")
row.names <- c("ROW1","ROW2","ROW3")
matrix.names <- c("Matrix1","Matrix2")
# 創建數組,并設置各個維度的名稱
result <- array(c(vector1,vector2),dim = c(3,3,2),dimnames = list(row.names,column.names,matrix.names))
print(result)
# 顯示數組第一個矩陣中第一行第三列的元素,三個參數分別是行列個
print(result[1,3,1])
# 跨維度計算 數組 數據名稱 計算函數
apply(x, margin, fun)
# 計算數組中所有矩陣第一行的數字之和
result <- apply(new.array, c(1), sum)
print(result)
因子(類別數據)
factor(x = character(), levels, labels = levels,
exclude = NA, ordered = is.ordered(x), nmax = NA)
x <- c("男", "女", "男", "男", "女")
sex <- factor(x)
print(sex)
print(is.factor(sex))
[1] 男 女 男 男 女
Levels: 男 女
[1] TRUE
# levels 類別 nlevels 類別數目
數據框(dataframe 表格)
- …: 列向量,可以是任何類型(字符型、數值型、邏輯型),一般以 tag = value 的形式表示,也可以是 value。
- row.names: 行名,默認為 NULL,可以設置為單個數字、字符串或字符串和數字的向量。
- check.rows: 檢測行的名稱和長度是否一致。
- check.names: 檢測數據框的變量名是否合法。
- fix.empty.names: 設置未命名的參數是否自動設置名字。
- stringsAsFactors: 布爾值,字符是否轉換為因子,factory-fresh 的默認值是 TRUE,可以通過設置選項(stringsAsFactors=FALSE)來修改。
data.frame(…, row.names = NULL, check.rows = FALSE,
check.names = TRUE, fix.empty.names = TRUE,
stringsAsFactors = default.stringsAsFactors())
table = data.frame(
姓名 = c("張三", "李四"),
工號 = c("001","002"),
月薪 = c(1000, 2000)
)
print(table) # 查看 table 數據
# 獲取數據結構
str(table)
# 顯示概要
print(summary(table))
# 提取指定的列
result <- data.frame(table$姓名,table$月薪)
print(result)
# 讀取第 2 、3 行的第 1 、2 列數據:
result <- table[c(2,3),c(1,2)]
# 添加部門列
table$部門 <- c("運營","技術","編輯")
# 將向量組合成數據框
addresses <- cbind(sites,likes,url)
# 合并兩個數據框
result <- rbind(table,newtable)
數據重塑(=sql的join,用的時候再看,估計用不上,大概)
- x, y: 數據框
- by, by.x, by.y:指定兩個數據框中匹配列名稱,默認情況下使用兩個數據框中相同列名稱。
- all:邏輯值; all = L 是 all.x = L 和 all.y = L 的簡寫,L 可以是 TRUE 或 FALSE。
- all.x:邏輯值,默認為 FALSE。如果為 TRUE, 顯示 x 中匹配的行,即便 y 中沒有對應匹配的行,y 中沒有匹配的行用 NA 來表示。
- all.y:邏輯值,默認為 FALSE。如果為 TRUE, 顯示 y 中匹配的行,即便 x 中沒有對應匹配的行,x 中沒有匹配的行用 NA 來表示。
- sort:邏輯值,是否對列進行排序。
# merge函數
merge(x, y, by = intersect(names(x), names(y)),
by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all,
sort = TRUE, suffixes = c(".x",".y"), no.dups = TRUE,
incomparables = NULL, …)
https://www.runoob.com/r/r-data-reshaping.html
分支語句
if語句:和c一樣
switch:switch(expression, case1, case2, case3....)
#1.按值匹配。整數匹配不在范圍內的則返回NULL。
x <- switch(
3,
"google",
"runoob",
"taobao",
"weibo"
)
print(x)
[1] "taobao"
#2.按變量匹配
you.like<-"runoob"
switch(you.like, google="www.google.com", runoob = "www.runoob.com", taobao = "www.taobao.com")
[1] "www.runoob.com"
循環語句
repeat
循環,直到condition為true,退出用break
repeat {
// 相關代碼
if(condition) {
break
}
}
while
和c一樣
for
和python一樣
next
和continue一樣
函數(全是懶加載)
定義函數
function_name <- function(arg_1, arg_2, ...) {
// 函數體
}
調用
和python一樣。
如果指定參數名和對應值,使用時可不按順序排列傳遞參數
內置函數
seq(a,b)輸出a到b
mean(a:b)輸出a、b平均數
sum(a:b)計算a到b數字的和
庫
# 查看包安裝目錄
.libPaths()
# 查看已安裝的包
library()
# 安裝包 清華源
install.packages("MASS", repos = "https://mirrors.ustc.edu.cn/CRAN/")
圖
餅狀圖
x: 數值向量,表示每個扇形的面積。
labels: 字符型向量,表示各扇形面積標簽。
edges: 這個參數用處不大,指的是多邊形的邊數(圓的輪廓類似很多邊的多邊形)。
radius: 餅圖的半徑。
main: 餅圖的標題。
clockwise: 是一個邏輯值,用來指示餅圖各個切片是否按順時針做出分割。
angle: 設置底紋的斜率。
density: 底紋的密度。默認值為 NULL。
col: 是表示每個扇形的顏色,相當于調色板。
pie(x, labels = names(x), edges = 200, radius = 0.8,
clockwise = FALSE, init.angle = if(clockwise) 90 else 0,
density = NULL, angle = 45, col = NULL, border = NULL,
lty = NULL, main = NULL, …)
# 輸出圖片
png(file='runoob-pie.png', height=300, width=300)
# 數據準備
info = c(1, 2, 4, 8)
# 命名
names = c("Google", "Runoob", "Taobao", "Weibo")
# 涂色(可選)
cols = c("#ED1C24","#22B14C","#FFC90E","#3f48CC")
# 計算百分比
piepercent = paste(round(100*info/sum(info)), "%")
# 繪圖
pie(info, labels=piepercent, main = "網站分析", col=cols, family='GB1')
# 添加顏色樣本標注
legend("topright", names, cex=0.8, fill=cols)
#3D圖
library(plotrix)
pie3D(info,labels = names,explode = 0.1, main = "3D 圖",family = "STHeitiTC-Light")
條形圖
H 向量或矩陣,包含圖表用的數字值,每個數值表示矩形條的高度。
xlab x 軸標簽。
ylab y 軸標簽。
main 圖表標題。
names.arg 每個矩形條的名稱。
col 每個矩形條的顏色。
中文字體需要設置字體參數 family='GB1'
-
beside 參數 beside 設置矩形條堆疊的方式,默認為 FALSE
library(showtext); font_add("SyHei", "SourceHanSansSC-Bold.otf"); cvd19 = matrix( c(83017, 83534, 1794546, 2640626, 190535, 585493), 2, 3 ) # 設置文件名,輸出為 png png(file = "runoob-bar-1.png") #加載字體 showtext_begin(); colnames(cvd19) = c("中國", "美國", "印度") rownames(cvd19) = c("6月", "7月") barplot(cvd19, main = "新冠疫情條形圖", beside=TRUE, legend=TRUE, family='SyHei') # 去掉字體 showtext_end();
散點圖
- x 橫坐標 x 軸的數據集合
- y 縱坐標 y 軸的數據集合
- type:繪圖的類型,p 為點、l 為直線, o 同時繪制點和線,且線穿過點。
- main 圖表標題。
- xlab、ylab x 軸和 y 軸的標簽名稱。
- xlim、ylim x 軸和 y 軸的范圍。
- axes 布爾值,是否繪制兩個 x 軸。
type 參數可選擇值:
- p:點圖
- l:線圖
- b:同時繪制點和線
- c:僅繪制參數 b 所示的線
- o:同時繪制點和線,且線穿過點
- h:繪制出點到橫坐標軸的垂直線
- s:階梯圖,先橫后縱
- S:階梯圖,先縱后豎
- n: 空圖
#普通散點圖
plot(x, y, type="p", main, xlab, ylab, xlim, ylim, axes)
#散點圖矩陣
# 4 個變量繪制矩陣,12 個圖,第一個參數是各個變量
pairs(~wt+mpg+disp+cyl,data = mtcars, main = "Scatterplot Matrix")