1. 程式人生 > >R語言學習4:函式,流程控制,資料框重塑

R語言學習4:函式,流程控制,資料框重塑

本系列是一個新的系列,在此係列中,我將和大家共同學習R語言。由於我對R語言的瞭解也甚少,所以本系列更多以一個學習者的視角來完成。 參考教材:《R語言實戰》第二版(Robert I.Kabacoff),書中所提到的[John Cook的優秀博文](https://www.johndcook.com/blog/r_language_for_programmers/),關於程式碼規範的《[來自Google的R語言編碼風格指南](https://nanx.me/rstyle/)》。 [TOC] ## 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)`函式用於生成一個等差序列,包含`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`的語法是: ```R for (var in seq){ statement } ``` 迴圈結構`while`的語法是: ```R while (cond){ statement } ``` 在處理大資料集中的行和列時,R中的迴圈比較低效費時,最好聯合使用R的內建函式和`apply`族函式。 條件結構`if-else`的語法是: ```R if (cond){ statement1 } else{ statement2 } ``` `else`的部分可以沒有。以上結構可以緊湊地寫成`ifelse`版本,語法為: ```R ifelse(cond, statement1, statement2) ``` 這類似於一個三目運算子,如果生成的結果都是向量,使用`ifelse`更合適。 條件結構`switch`可以根據一個表示式的值來選擇語句執行,語法為: ```R switch( expr, value1 = statement1, value2 = statement2, ... ) ``` 需要注意的是,如果`expr`的值是一個字串,則`value1, value2`等值的內容也是字串,但是**不需要加引號**。 ### Section 2:自編函式 R中使用`function`函式來自編函式,為了儘可能返回豐富的資訊,返回值經常是一個列表,用於儲存一系列物件。語法如下: ```R myfunction <- function(arg1, arg2, ...){ statement object <- list(value1=value1, value2=value2, ...) # 這句是不一定需要的 return(object) # 如果沒有return()則最後一行程式碼的返回值作為return的內容 } ``` ### Section 3:使用`reshape2`重構資料集 `reshape2`包是一套重構和整合資料集的萬能工具,需要使用前安裝: ```R install.package("reshape2") library(reshape2) ``` 將使用如下的資料框進行處理。 ```R 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`則是資料框的主鍵,輸出一個新的資料框:每個測量變數獨佔一行,行中包含確定這個測量變數所需的識別符號。此時,融合資料框操作的程式碼為 ```R md <- melt(mydata, id=c("ID", "Time")) ``` 得到的結果是 可以對融合後的資料框使用`dcast()`函式進行重鑄,呼叫格式是`dcast(md, formula, fun.aggregate)`,這裡`md`是已融合的資料,`formula`接受一個公式,描述了最後的想要結果,公式的形式是 $$ \text{rowvar1}+\text{rowvar}2+\cdots\quad \sim\quad \text{colvar1}+\text{colvar2}+\cdots $$ 這裡,`rowvar`中的變數作為主鍵,`colvar`中的變數作為資料框的值,返回的資料框包含所有的`rowvar`和`colvar`作為變數。`fun.aggregate`引數是可選的整合函式。

相關推薦

R語言學習4函式流程控制資料重塑

本系列是一個新的系列,在此係列中,我將和大家共同學習R語言。由於我對R語言的瞭解也甚少,所以本系列更多以一個學習者的視角來完成。 參考教材:《R語言實戰》第二版(Robert I.Kabacoff),書中所提到的[John Cook的優秀博文](https://www.johndcook.com/blog/

R語言學習筆記choose、factorial、combn排列組合函式

一、總結 組合數:choose(n,k) —— 從n箇中選出k個 階乘:factorial(k) —— k! 排列數:choose(n,k) * factorial(k) 冪:^ 餘數:%% 整數商:%/% 列出所有組合數矩陣:combn(x,n) t(combn(x,n)) 轉置 二、具體

R語言學習筆記sort、rank、order、arrange排序函式

  R語言中排序有幾個基本函式:sort()、rank()、order()、arrange() 一、總結   sort()函式是對向量進行從小到大的排序   rank()函式返回的是對向量中每個數值對應的秩   order()函式返回的值表示位置,依次對應的是向量的最小值、次小值、第三小值……最大值等

R語言學習筆記(四)流程函式及自定義函式

if(FALSE){條件執行} if(FALSE){if-else結構,多重判斷} if(FALSE){對score進行等級判定} score = 65 if(score >= 90){ pr

R語言學習筆記sort、rank、order、arrange排序函數

排序。 bsp 個數 span 意義 data 二維 desc 表示   R語言中排序有幾個基本函數:sort()、rank()、order()、arrange() 一、總結   sort()函數是對向量進行從小到大的排序   rank()函數返回的是對向量中每個數值對應的

R語言學習筆記——melt()函式之整齊資料

R語言學習筆記(二) melt()函式 melt(data,id.vars,measure.vars,variable.name=“variable”,…,na.rm=FALSE,value.name=“value”,factorsAsStrings=TRUE)

R語言學習筆記時間序列分析

1.生成時間序列 ts() ts(data = NA, start = 1, end = numeric(), frequency = 1, deltat = 1, ts.eps = getOption("ts.eps"), class =, names = )data是數

R語言學習記錄因子分析的R實現

時間: 2018-08-09(學習時間)、2018-08-12(記錄時間) 教程:知乎:Learn R | 資料降維之主成分分析(上)、Learn R | 資料降維之因子分析(下) 作者:Jason 資料來源:《應用多元統計分析》 王學民 編著 P261

R語言學習筆記引數點估計

1.點估計 點估計主要有兩種方法,分別是矩估計和極大似然估計,具體原理可參考統計學教材。 矩估計需要解n元方程,在R語言中有: 解一次方程:uniroot(),呼叫格式為; uniroot(f,interval,...,lower = min(interval), uppe

R語言學習筆記 —— table 函式的應用

一、table 函式對應的就是統計學中的列聯表,是一種記錄頻數的方法,對於統計來說有非常重要的應用,下面的例子都是針對維數為2的情況舉例,多維的情況是類似的 下面看一個例子: > ct <- data.frame( + Vote.for.X =

R語言學習2繪圖

本系列是一個新的系列,在此係列中,我將和大家共同學習R語言。由於我對R語言的瞭解也甚少,所以本系列更多以一個學習者的視角來完成。 參考教材:《R語言實戰》第二版(Robert I.Kabacoff),書中所提到的[John Cook的優秀博文](https://www.johndcook.com/blog/

Go語言學習筆記(四) 流程控制

程式設計語言的流程控制語句,用於設定計算執行的次序,建立程式的邏輯結構。可以說,流程控制語句是整個程式的骨架。從根本上講,流程控制只是為了控制程式語句的執行順序,一般需要與各種條件配合,因此,在各種流程中,會加入條件判斷語句。流程控制語句一般起以下3個作用:   選擇,即根據

golang基礎之三-字串時間流程控制函式

strings和strconv的使用 strings strings.HasPrefix(s string,preffix string) bool:判斷字串s是否以prefix開頭 stirngs.HasSuffix(s string,suffix string) bool:判斷字串s是否以suffi

js---11運算符流程控制真假

arr body color 空格 one round red 轉換 class <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="tex

視圖觸發器事務存儲過程函數流程控制

部門 ces fault PE time into 事務 sele else 一,視圖1,什麽是視圖? 視圖就是通過查詢得到一張虛擬表,然後保存下來,下次用的話直接使用即可2,為什麽要用視圖 如果要頻繁使用一張虛擬表,可以不用重復查詢3,怎麽用? 在查詢

R語言筆記(四): 向量、陣列、矩陣與資料 + 利用矩陣求解二維線性方程組

在筆記一中已經提到了向量,這篇文章主要介紹R語言中的四中常用的結構: 向量:*傳送門* 陣列 矩陣 資料框 然後在介紹如何利用矩陣求解二維線性方程組。   ***************************************************

golang基礎之三-字符串時間流程控制函數

替換 單個 field Golan right mic 寫法 clas \n strings和strconv的使用 strings strings.HasPrefix(s string,preffix string) bool:判斷字符串s是否以prefix開頭 stirn

python 11day--python基礎總結運算子、流程控制資料型別總結

一、python的運算子: 1、算數運算:加、減、乘、除、求餘、求商、x的y次方 2、邏輯運算:and、 or 、not 3、比較運算子:等於、不等於、大於、小於、大於等於、小於等於 4、賦值運算子:加賦值、減賦值、乘賦值、除賦值、求餘賦值、求商賦值、x的y次方賦值、普通賦值 5、成員運算子 :in

3、Python基礎——輸入輸出簡單運算子流程控制轉譯

參考原文:https://www.cnblogs.com/zihe/p/6951804.html 一、1、輸入輸出 python3中統一都是input python2中有raw_input等同於python3的input,另外python2中也有input #python輸入程式碼 &g

我的Python成長之路--Day48--mysql高階(檢視、觸發器、事物、儲存過程、函式流程控制資料備份與恢復)

目錄 1、檢視 2、觸發器 3、事物 自定義函式 1、檢視 1.1、什麼是檢視 檢視是一張表或者多張表的查詢結果構成的一張虛擬表