[R語言實戰(zhàn)筆記] 第5章 高級數(shù)據(jù)管理

本章內(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ù)中計算概率值。


image.png
  1. 設(shè)定隨機數(shù)種子
    在每次生成偽隨機數(shù)的時候桥温,函數(shù)都會使用一個不同的種子引矩,因此也會產(chǎn)生不同的結(jié)果。set.seed()
runif(5) #重復(fù)兩次
set.seed(1234)
runif(5)
  1. 生成多元正態(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è)文本的格式区端。

image.png

image.png

正則表達(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ù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末塌忽,一起剝皮案震驚了整個濱河市拍埠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌土居,老刑警劉巖枣购,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異擦耀,居然都是意外死亡棉圈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門眷蜓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來分瘾,“玉大人,你說我怎么就攤上這事吁系〉抡伲” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵汽纤,是天一觀的道長上岗。 經(jīng)常有香客問我,道長冒版,這世上最難降的妖魔是什么液茎? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮辞嗡,結(jié)果婚禮上捆等,老公的妹妹穿的比我還像新娘。我一直安慰自己续室,他們只是感情好栋烤,可當(dāng)我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挺狰,像睡著了一般明郭。 火紅的嫁衣襯著肌膚如雪买窟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天薯定,我揣著相機與錄音始绍,去河邊找鬼。 笑死话侄,一個胖子當(dāng)著我的面吹牛亏推,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播年堆,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼吞杭,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了变丧?” 一聲冷哼從身側(cè)響起芽狗,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痒蓬,沒想到半個月后童擎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡谊却,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年柔昼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片炎辨。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡捕透,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出碴萧,到底是詐尸還是另有隱情乙嘀,我是刑警寧澤,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布破喻,位于F島的核電站虎谢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏曹质。R本人自食惡果不足惜婴噩,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望羽德。 院中可真熱鬧几莽,春花似錦、人聲如沸宅静。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姨夹。三九已至纤垂,卻和暖如春矾策,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背峭沦。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工贾虽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人吼鱼。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓榄鉴,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛉抓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,976評論 2 355