本章內(nèi)容
數(shù)學(xué)和統(tǒng)計函數(shù)
字符處理函數(shù)
循環(huán)和條件執(zhí)行
自編函數(shù)
數(shù)據(jù)整合與重塑
5.1 一個數(shù)據(jù)處理難題
均值和標(biāo)準(zhǔn)差相去甚遠(yuǎn),求平均值沒有意義屋匕。變換為可比較的單元葛碧。巧妙利用數(shù)值和字符處理函數(shù)。
5.2 數(shù)值和字符處理函數(shù)
數(shù)據(jù)處理基石的函數(shù):數(shù)值(數(shù)學(xué)过吻、統(tǒng)計进泼、概率)函數(shù)和字符處理函數(shù),應(yīng)用于矩陣和數(shù)據(jù)框纤虽。
5.2.1 數(shù)學(xué)函數(shù)
對數(shù)據(jù)做變換是這些函數(shù)的一個主要用途乳绕。當(dāng)應(yīng)用于數(shù)值向量、矩陣或數(shù)據(jù)框時逼纸,會作用于每一個獨立的值
洋措。[P86]
abs(x) # 絕對值
sqrt(x) # 平方根
ceiling(x) # 不小于x的最小整數(shù)
floor(x) # 不大于x的最大整數(shù)
log(x, base = n) # 對x取以n為底的對數(shù)
log(x)
log10(x)
log(10)
log10(10)
exp(x) # 指數(shù)函數(shù)
5.2.2 統(tǒng)計函數(shù)
許多函數(shù)都有影響輸出結(jié)果的可選參數(shù)。比如:
y <- mea(x)
z <- mean(x, trim = 0.05, na.rm = TRUE)
y
提供了算術(shù)平均數(shù)杰刽,z
提供了截尾平均數(shù)菠发,即丟棄了最大5%和最小5%的數(shù)據(jù)和所有缺失值后的算術(shù)平均數(shù)。
mean(x)
median(x)
sd(x)
var(x)
mad(x)
quantile(x, probs)
range(x)
sum(x)
diff(x, lag = n)
min(n)
max(x)
scale(x, center = TRUE, scale = TRUE) #為數(shù)據(jù)對象x按列進(jìn)行中心化或標(biāo)準(zhǔn)化
##均值和標(biāo)準(zhǔn)差的計算
x <- c(1:8)
#簡潔的方式
mean(x)
sd(x)
#冗長的方式
n <- length(x)
meanx <- sum(x)/n
css <- sum((x - meanx)^2)
sdx <- sqrt(css / (n-1))
meanx
sdx
數(shù)據(jù)的標(biāo)準(zhǔn)化
默認(rèn)情況下贺嫂,函數(shù)scale()
對矩陣或數(shù)據(jù)框的指定列
進(jìn)行均值為0滓鸠、標(biāo)準(zhǔn)差為1
的標(biāo)準(zhǔn)化:
newdata <- scale(mydata)
要對每一列進(jìn)行任意均值和標(biāo)準(zhǔn)差的標(biāo)準(zhǔn)化,可以使用如下的代碼:
newdata <- scale(mydata)*SD + M
其中的M是想要的均值第喳,SD為想要的標(biāo)準(zhǔn)差糜俗。在非數(shù)值型
的列上使用scale()函數(shù)將會報錯
。要 對指定列
而不是整個矩陣或數(shù)據(jù)框進(jìn)行標(biāo)準(zhǔn)化曲饱,你可以使用這樣的代碼:
newdata <- transform(mydata, myvar = scale(myvar)*10 +50)
此句將變量myvar標(biāo)準(zhǔn)化為均值50吩跋、標(biāo)準(zhǔn)差為10的變量。
5.2.3 概率函數(shù)
概率函數(shù)通常用來生產(chǎn)特征已知的模擬數(shù)據(jù)渔工,以及在用戶編寫的統(tǒng)計函數(shù)中計算概率值。
- 設(shè)定隨機數(shù)種子
在每次生成偽隨機數(shù)的時候桥温,函數(shù)都會使用一個不同的種子引矩,因此也會產(chǎn)生不同的結(jié)果。set.seed()
runif(5) #重復(fù)兩次
set.seed(1234)
runif(5)
- 生成多元正態(tài)數(shù)據(jù)
在模擬研究和蒙特卡洛方法中,你經(jīng)常要獲取來自給定均值向量和協(xié)方差陣的多元正態(tài)分布的數(shù)據(jù)旺韭。MASS包中的mvnorm()函數(shù)可以讓這個問題變得很容易氛谜。
mvnorm(n, mean, siga)
5.2.4 字符處理函數(shù)
字符處理函數(shù)可以從文本型數(shù)據(jù)中抽取信息,或者為打印輸出和生成報告重設(shè)文本的格式区端。
正則表達(dá)式(英語:Regular Expression值漫,常簡寫為regex、regexp或RE)织盼,又稱正則表示式杨何、正則表示法、規(guī)則表達(dá)式沥邻、常規(guī)表示法危虱,是計算機科學(xué)的一個概念。正則表達(dá)式使用單個字符串來描述唐全、匹配一系列匹配某個句法規(guī)則的字符串埃跷、。在很多文本編輯器里邮利,正則表達(dá)式通常被用來檢索弥雹、替換那些匹配某個模式的文本。
5.2.5 其他實用函數(shù)
下列函數(shù)對于數(shù)據(jù)管理和處理同樣非常實用延届。
length(x) #對象x的長度
seq(from, to , by) #生成一個序列
rep(x, n) #將x重復(fù)n次
cut(x, n) #將連續(xù)型變量x分割為有著n個水平的因子
#使用選項ordered_result = TRUE以創(chuàng)建一個有序型因子
pretty(x, n) #創(chuàng)建美觀的分割點剪勿。通過選取n+1個等間距的取整值,將一個連續(xù)型變量x分割為n個 區(qū)間祷愉。繪圖中常用
cat(..., file = "filename", append = F) #連接...中的對象窗宦,并將其輸出到屏幕上或文件中(如果聲明了一個的話)
注:\n
表示新行,\t
表示制表符二鳄,\'
表示單引號赴涵,\b
表示退格。(鍵入?quotes
了解更多)
5.2.6 將函數(shù)應(yīng)用于矩陣和數(shù)據(jù)框
R函數(shù)的諸多有趣特性之一订讼,就是它們可以應(yīng)用到一系列的數(shù)據(jù)對象上髓窜,包括標(biāo)量、向量欺殿、 矩陣寄纵、數(shù)組和數(shù)據(jù)框。
> a <- 5
> sqrt(5)
[1] 2.236068
> b <- c(1.243, 5.654, 2.99)
> round(b)
[1] 1 6 3
> c <- matrix(runif(12), nrow = 3)
> c
[,1] [,2] [,3] [,4]
[1,] 0.7699015 0.61823636 0.820176206 0.6085722
[2,] 0.7128397 0.05048374 0.009614496 0.7698180
[3,] 0.3033602 0.04321880 0.102491504 0.6605425
> log(c)
[,1] [,2] [,3] [,4]
[1,] -0.2614926 -0.4808844 -0.1982361 -0.4966397
[2,] -0.3384987 -2.9861040 -4.6444833 -0.2616011
[3,] -1.1928344 -3.1414796 -2.2779754 -0.4146939
> mean(c) #矩陣c求均值的結(jié)果為一個標(biāo)量(0.444)脖苏。函數(shù)mean()求得的是 矩陣中全部12個元素的均值程拭。
[1] 0.4557713
apply()函數(shù),可將一個任意函數(shù)“應(yīng)用”到矩陣棍潘、數(shù)組恃鞋、數(shù)據(jù)框的任何維度上崖媚。
apply(x, MARGIN, FUN, ...)
MARGIN=1表示行,MARGIN=2表示列恤浪。
> mydata <- matrix(rnorm(30), nrow = 6) #生成了一個包含正態(tài)隨機數(shù)的6×5矩陣
> mydata
[,1] [,2] [,3] [,4] [,5]
[1,] -0.7826228 -1.1176011 -0.3271264 -0.80825957 -0.9345593
[2,] 0.5092959 0.2340028 -2.2632252 -0.51215317 0.6303857
[3,] -1.4899391 0.3161516 0.2855605 -1.80397184 0.7607600
[4,] -0.3191793 0.3707686 0.9684286 0.04062997 -0.5116228
[5,] -0.2379111 0.8775886 0.8673066 2.63601650 1.0019075
[6,] 1.6186229 -1.7683235 1.3781350 -1.61599923 -0.3833922
> apply(mydata, 1, mean) #計算6行的均值
[1] -0.7940338 -0.2803388 -0.3862878 0.1098050 1.0289816 -0.1541914
> apply(mydata, 2, mean) #計算5列的均值
[1] -0.11695557 -0.18123552 0.15151317 -0.34395622 0.09391315
> apply(mydata, 2, mean, trim = 0.2) #計算每列的截尾均值
[1] -0.20760431 -0.04916954 0.44854232 -0.72394550 0.12403268
5.3 數(shù)據(jù)處理難題的一套解決方案
見P96畅哑。
瞧!小事一樁水由!
5.4 控制流
- 語句(statement)是一條單獨的R語句或一組復(fù)合語句荠呐。(包含在花括號{ } 中的一組R語 句,使用分號分隔)砂客;
- 條件(cond)是一條最終被解析為真(TRUE)或假(FALSE)的表達(dá)式泥张;
- 表達(dá)式(expr)是一條數(shù)值或字符串的求值語句。
- 序列(seq)是一個數(shù)值或字符串函數(shù)鞭盟。
5.4.1 重復(fù)和循環(huán)
for結(jié)構(gòu)
for循環(huán)重復(fù)地執(zhí)行一個語句圾结,直到某個變量的值不再包含在序列seq中為止。
for (var in seq) statement
for (i in 1:10) print("Hello")
while結(jié)構(gòu)
while循環(huán)重復(fù)地執(zhí)行一個語句齿诉,直到條件不為真為止筝野。
while (cond) statement
> i <- 10
> while(i > 0) {print("Hello"); i <- 1-1}
[1] "Hello"
> while(i > 0) {print("Hello"); i <- i-1}
> i <- 10
> while(i > 0) {print("Hello"); i <- i-1}
[1] "Hello"
[1] "Hello"
[1] "Hello"
[1] "Hello"
[1] "Hello"
[1] "Hello"
[1] "Hello"
[1] "Hello"
[1] "Hello"
[1] "Hello"
5.4.2 條件執(zhí)行
在條件執(zhí)行結(jié)構(gòu)中, 一條或一組語句僅在滿足一個指定條件時執(zhí)行粤剧。 條件執(zhí)行結(jié)構(gòu)包括 if-else歇竟、ifelse和switch。
- if-else結(jié)構(gòu)
if (cond) statement
if (cond) statement else statement2
- ifelse結(jié)構(gòu)
ifelse (cond, statement1, statement2)
- swtich結(jié)構(gòu)
switch (expr, ...)
> feelings <- c("sad","afraid")
> for(i in feelings) print(
+ switch(i,
+ happy = "I am glad you are happy",
+ afraid = "There is nothing to fear",
+ sad = "Cheer up",
+ angry = "Calm down now"
+ )
+ )
[1] "Cheer up"
[1] "There is nothing to fear"
5.5 用戶自編函數(shù)
一個函數(shù)的結(jié)構(gòu)看起來大致如此:
myfunction <- function(arg1, arg2, ...) {statements return(object)}
假設(shè)你想編寫一個函數(shù)抵恋,用來計算數(shù)據(jù)對象的集中趨勢和散布情況焕议。此函數(shù)應(yīng)當(dāng)可以選擇性地給出參數(shù)統(tǒng)計量(均值和標(biāo)準(zhǔn)差)和非參數(shù)統(tǒng)計量(中位數(shù)和絕對中位差)。結(jié)果應(yīng)當(dāng)以一個 含名稱列表的形式給出弧关。另外盅安,用戶應(yīng)當(dāng)可以選擇是否自動輸出結(jié)果。除非另外指定世囊,否則此函 數(shù)的默認(rèn)行為應(yīng)當(dāng)是計算參數(shù)統(tǒng)計量并且不輸出結(jié)果别瞭。
mystats <- function(x, parametric = T, print = F) {
if (parametric) {
center <- mean(x); spread <- sd(x)
} else {
center <- median(x); spread <- mad(x)
}
if (print & parametric) {
cat("Mean = ", center, "\n", "SD = ", spread, "\n")
} else if (print & !parametric) {
cat("Median=", center, "\n", "MAD=", spread, "\n")
}
results <- list(center = center, spread = spread)
return(results)
}
set.seed(1234)
x <- rnorm(500)
y <- mystats(x)
y <- mystats(x, parametric = F, print = T)
5.6 整合與重構(gòu)
R中提供了許多用來整合(aggregate)和重塑(reshape)數(shù)據(jù)的強大方法。本節(jié)主要使用mtcars
數(shù)據(jù)集株憾。請參閱help(mtcars)
蝙寨。
5.6.1 轉(zhuǎn)置
t()
反轉(zhuǎn)行和列
5.6.2 整合數(shù)據(jù)
在R中使用一個或多個by變量和一個預(yù)先定義好的函數(shù)來折疊(collapse)數(shù)據(jù)是比較容易的。
aggregate(x, by, FUN)
其中x是待折疊的數(shù)據(jù)對象嗤瞎,by是一個變量名組成的列表墙歪,這些變量將被去掉以形成新的觀測, 而FUN則是用來計算描述性統(tǒng)計量的標(biāo)量函數(shù)贝奇,它將被用來計算新觀測中的值虹菲。
> options(digits = 3)
> attach(mtcars)
> aggdata <- aggregate(x = mtcars, by = list(cyl, gear), FUN = mean, na.rm = T)
> aggdata
Group.1 Group.2 mpg cyl disp hp drat wt qsec vs am gear carb
1 4 3 21.5 4 120 97 3.70 2.46 20.0 1.0 0.00 3 1.00
2 6 3 19.8 6 242 108 2.92 3.34 19.8 1.0 0.00 3 1.00
3 8 3 15.1 8 358 194 3.12 4.10 17.1 0.0 0.00 3 3.08
4 4 4 26.9 4 103 76 4.11 2.38 19.6 1.0 0.75 4 1.50
5 6 4 19.8 6 164 116 3.91 3.09 17.7 0.5 0.50 4 4.00
6 4 5 28.2 4 108 102 4.10 1.83 16.8 0.5 1.00 5 2.00
7 6 5 19.7 6 145 175 3.62 2.77 15.5 0.0 1.00 5 6.00
8 8 5 15.4 8 326 300 3.88 3.37 14.6 0.0 1.00 5 6.00
在使用aggregate()函數(shù)的時候,by中的變量必須在一個列表中(即使只有一個變量)掉瞳。
5.6.3 reshape2包
reshape包是一套重構(gòu)和整合數(shù)據(jù)集的絕妙的萬能工具届惋。有點難度髓帽!
數(shù)據(jù)融合(melt)
和重鑄(cast)
- 融合
> 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)
> mydata
ID Time X1 X2
1 1 1 5 6
2 1 2 3 5
3 2 1 6 1
4 2 2 2 4
> library(reshape2)
> md <- melt(mydata, id = c("ID", "Time"))
> md
ID Time variable value
1 1 1 X1 5
2 1 2 X1 3
3 2 1 X1 6
4 2 2 X1 2
5 1 1 X2 6
6 1 2 X2 5
7 2 1 X2 1
8 2 2 X2 4
必須指定要唯一確定每個測量所需的變量(ID和Time),而表示測量變量名的變量(X1 或X2)將由程序為你自動創(chuàng)建脑豹。
-
重塑
newdata <- dcast(md, formula, fun.aggregate)
其中的md為已融合的數(shù)據(jù),formula描述了想要的最后結(jié)果衡查,而FUN是(可選的)數(shù)據(jù)整合函數(shù)瘩欺。
image.png
5.7 小結(jié)
處理數(shù)據(jù)的數(shù)學(xué)、統(tǒng)計和概率函數(shù)
函數(shù)應(yīng)用于向量拌牲、矩陣和數(shù)據(jù)框
控制流結(jié)構(gòu):循環(huán)重復(fù)俱饿,條件
自定義函數(shù)
折疊、整合以及重構(gòu)數(shù)據(jù)