R語言學習4:函數,流程控制,數據框重塑


本系列是一個新的系列,在此系列中,我將和大家共同學習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進行標准化

這里方差的計算是無偏的,即

\[S^2=\frac{1}{n-1}\sum_{j=1}^n(X_j-\bar X)^2. \]

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)函數用於生成一個等差序列,包含fromto,這里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)
image-20210226142940019

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

md <- melt(mydata, id=c("ID", "Time"))

得到的結果是

image-20210226143051595

可以對融合后的數據框使用dcast()函數進行重鑄,調用格式是dcast(md, formula, fun.aggregate),這里md是已融合的數據,formula接受一個公式,描述了最后的想要結果,公式的形式是

\[\text{rowvar1}+\text{rowvar}2+\cdots\quad \sim\quad \text{colvar1}+\text{colvar2}+\cdots \]

這里,rowvar中的變量作為主鍵,colvar中的變量作為數據框的值,返回的數據框包含所有的rowvarcolvar作為變量。fun.aggregate參數是可選的整合函數。

image-20210226144742505


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM