本系列是一個新的系列,在此系列中,我將和大家共同學習R語言。由於我對R語言的了解也甚少,所以本系列更多以一個學習者的視角來完成。
參考教材:《R語言實戰》第二版(Robert I.Kabacoff),書中所提到的John Cook的優秀博文,關於代碼規范的《來自Google的R語言編碼風格指南》。
Part 1:函數
Section 1:數學與統計函數
數學函數用於對數據作變換。
函數 | 描述 |
---|---|
abx(x) |
絕對值 |
sqrt(x) |
平方根 |
ceiling(x) |
天花板,不小於x 的最小整數 |
floor(x) |
地板,不大於x 的最大整數 |
trunc(x) |
截尾,向\(0\)的方向截取x 的整數部分 |
round(x, digits=n) |
四舍五入,保留\(n\)位小數 |
signif(x, digits=n) |
四舍五入,保留\(n\)位有效數字 |
cos(x), sin(x), tan(x) |
三角函數 |
acos(x), asin(x), atan(x) |
反三角函數 |
cosh(x), sinh(x), tanh(x) |
雙曲三角函數 |
acosh(x), asinh(x), atanh(x) |
反雙曲余弦函數 |
log(x, banse=n) |
對數\(\log_{n}(x)\) |
log(x), log10(x) |
自然對數\(\ln(x)\)和常用對數\(\lg(x)\) |
exp(x) |
指數函數 |
統計函數常用於對數據作變換或統計,以下函數,許多都有如na.rm
之類的可選參數,可以使用?function
來查詢。
函數 | 描述 | 應用 |
---|---|---|
mean(x) |
平均數 | mean(c(1, 2, 3, 4)) 返回2.5 |
median(x) |
中位數 | median(c(1, 2, 3, 4)) 返回2.5 |
sd(x) |
標准差 | sd(c(1, 2, 3, 4)) 返回1.29 |
var(x) |
方差 | var(c(1, 2, 3, 4)) 返回1.67 |
mad(x) |
絕對中位差 | mad(c(1, 2, 3, 4)) 返回1.48 |
quantile(x, probs) |
求分位數 | x 是數值向量,probs 是概率值向量 |
range(x) |
求值域 | range(c(1, 2, 3, 4)) 返回c(1, 4) |
sum(x) |
求和 | sum(c(1, 2, 3, 4)) 返回10 |
diff(x, lag=n) |
滯后差分 | diff(c(1, 5, 23, 29)) 返回c(4, 18, 6) |
min(x) |
求最小值 | min(c(1, 2, 3, 4)) 返回1 |
max(x) |
求最大值 | max(c(1, 2, 3, 4)) 返回4 |
scale(x, center=TRUE, scale=TRUE) |
按列標准化 | center 進行中心化,scale 進行標准化 |
這里方差的計算是無偏的,即
Section 2:概率函數
在R語言中,概率函數是由d, p, q, r
再加上分布的名字縮寫所構成的函數,這四個字母分別具有如下的意義:
d
:密度函數(density)。p
:分布函數(distribution function)。q
:分位數函數(quantile function),第一個參數為q
,代表要求的(下側)分位點\(\alpha\)。r
:生成隨機數,第一個參數為n
,代表要生成的隨機數個數。
分布的名字如下表所示,按字母順序排序:
分布名 | R中縮寫 |
---|---|
Beta分布 | beta |
二項分布 | binom |
柯西分布 | cauchy |
卡方分布 | chisq |
指數分布 | exp |
F分布 | t |
Gamma分布 | gamma |
幾何分布 | geom |
超幾何分布 | hyper |
對數正態分布 | lnorm |
Logistic分布 | logis |
多項分布 | multinom |
負二項分布 | nbinom |
正態分布 | norm |
泊松分布 | pois |
Wilcoxon符號秩分布 | signrank |
t分布 | t |
均勻分布 | unif |
Weibull分布 | weibull |
Wilcoxon秩和分布 | wilcox |
每個分布都有其可選參數,可以通過?function
查詢。
設定種子可以讓結果可復現,在R語言中,set.seed()
函數可以顯式指定這個種子。
生成多元正態隨機數,可以使用mvrnorm(n, mean, sigma)
函數,這里mean
是均值向量,sigma
是協方差矩陣或相關矩陣。
Section 3:其他實用函數
這里介紹一些其他實用的函數。
length(x)
返回對象x
的長度。如果x
是向量,則返回向量長度;如果x
是數據框,則返回變量個數(而不是觀測個數),不過要返回數據框的相關信息,最好使用ncol
來返回變量個數,nrow
來返回觀測個數。
seq(from, to, by)
函數用於生成一個等差序列,包含from
和to
,這里by
是間距;rep(x, n)
將對象x
重復n
次用於生成一個重復序列;pretty(x, n)
將一個連續型變量x
通過美觀的分割點,分割為近似n
個區間。
cut(x, n)
將連續型變量x
分割成有n
個水平的因子,使用選項ordered_result=TRUE
可以創建有序型因子。
cat(...)
連接...
中的對象,並將其輸出到屏幕上或文件中,常用於打印字符串,可以用sep
指定分隔符,默認為空格。字符串中具有如下的轉義字符:\n
換行、\t
制表符、\'
單引號,\b
退格等等。
apply(x, MARGIN, FUN, ...)
函數允許將任意一個函數應用到矩陣、數組、數據框的任何維度上,這里x
是數據對象,MARGIN
是維度的下標,矩陣和數據框中MARGIN=1
代表行,MARGIN=2
代表列,FUN
是要運用的函數名。如果要運用的函數還有其他參數,可以在...
處指定。
t(x)
可以對數據框或者矩陣x
進行轉置,當x
為數據框時,行名將成為轉置后的變量名。aggregate(x, by, FUN)
是整合函數,類似於SQL中的GROUP BY
,這里by
是待折疊的變量名,必須在一個列表中(即使只有一個變量),FUN
是用於處理整合的函數。
Part 2:其他控制
Section 1:循環與條件結構
循環結構for
的語法是:
for (var in seq){
statement
}
循環結構while
的語法是:
while (cond){
statement
}
在處理大數據集中的行和列時,R中的循環比較低效費時,最好聯合使用R的內置函數和apply
族函數。
條件結構if-else
的語法是:
if (cond){
statement1
}
else{
statement2
}
else
的部分可以沒有。以上結構可以緊湊地寫成ifelse
版本,語法為:
ifelse(cond, statement1, statement2)
這類似於一個三目運算符,如果生成的結果都是向量,使用ifelse
更合適。
條件結構switch
可以根據一個表達式的值來選擇語句執行,語法為:
switch(
expr,
value1 = statement1,
value2 = statement2,
...
)
需要注意的是,如果expr
的值是一個字符串,則value1, value2
等值的內容也是字符串,但是不需要加引號。
Section 2:自編函數
R中使用function
函數來自編函數,為了盡可能返回豐富的信息,返回值經常是一個列表,用於存儲一系列對象。語法如下:
myfunction <- function(arg1, arg2, ...){
statement
object <- list(value1=value1, value2=value2, ...) # 這句是不一定需要的
return(object) # 如果沒有return()則最后一行代碼的返回值作為return的內容
}
Section 3:使用reshape2
重構數據集
reshape2
包是一套重構和整合數據集的萬能工具,需要使用前安裝:
install.package("reshape2")
library(reshape2)
將使用如下的數據框進行處理。
ID <- c(1, 1, 2, 2)
Time <- c(1, 2, 1, 2)
X1 <- c(5, 3, 6, 2)
X2 <- c(6, 5, 1, 4)
mydata <- data.frame(ID, Time, X1, X2)

使用該包對數據集進行處理,需要先對數據集進行融合(melt),再進行重鑄(cast)。融合使用函數melt(x, id)
,x
是待融合的數據框,id
則是數據框的主鍵,輸出一個新的數據框:每個測量變量獨占一行,行中包含確定這個測量變量所需的標識符。此時,融合數據框操作的代碼為
md <- melt(mydata, id=c("ID", "Time"))
得到的結果是

可以對融合后的數據框使用dcast()
函數進行重鑄,調用格式是dcast(md, formula, fun.aggregate)
,這里md
是已融合的數據,formula
接受一個公式,描述了最后的想要結果,公式的形式是
這里,rowvar
中的變量作為主鍵,colvar
中的變量作為數據框的值,返回的數據框包含所有的rowvar
和colvar
作為變量。fun.aggregate
參數是可選的整合函數。
