《R語(yǔ)言實(shí)戰(zhàn)》這本書上是這樣描述by()
函數(shù)的:
使用by()分組計(jì)算描述性統(tǒng)計(jì)量,它可以一次返回若干個(gè)統(tǒng)計(jì)量表牢。格式為:
by(data, INDICES, FUN)
其中data是一個(gè)數(shù)據(jù)框或矩陣;INDICES是一個(gè)因子或因子組成的列表,定義了分組;FUN是任意函數(shù)竹祷。
簡(jiǎn)單點(diǎn)說(shuō)by(data, INDICES, FUN)
函數(shù)的典型用法: 是將data
數(shù)據(jù)框或矩陣按照INDICES
因子水平進(jìn)行分組谈跛,然后對(duì)每組應(yīng)用FUN
函數(shù)羊苟。
是不是沒(méi)懂?反正看完后我沒(méi)懂~
下面我們通過(guò)實(shí)例來(lái)理解下by()
函數(shù):
我們假設(shè)2019年第二季度Jimmy老師收了五個(gè)學(xué)徒:
- 他們姓名分別是:
xg感憾;xj蜡励;hj;wh阻桅;xs
凉倚; - 他們年紀(jì)分別是:
23;24嫂沉;25稽寒;26;27
趟章; - 他們的性別分別是:
male杏糙;female;female蚓土;male宏侍;female
。
將以上學(xué)徒信息構(gòu)建成數(shù)據(jù)框蜀漆,存到biotrainee
變量名中:
biotrainee <- data.frame(name = c('xg','xj','hj','wh','xs'),
gender = c('male','female','female','male','female'),
ages = c(23,24,25,26,27))
> biotrainee #看下數(shù)據(jù)框內(nèi)容
name gender ages
1 xg male 23
2 xj female 24
3 hj female 25
4 wh male 26
5 xs female 27
學(xué)徒信息純屬虛構(gòu)谅河,如有雷同純屬巧合
我們想要將所有學(xué)徒按照性別分組,并分別計(jì)算每組學(xué)徒年齡的平均值,就可以通過(guò)by()
函數(shù)來(lái)實(shí)現(xiàn)绷耍,我們體會(huì)一下:by(biotrainee,biotrainee$gender,function(x) mean(x[,2]))
> by(biotrainee,biotrainee$gender,function(x) mean(x[,3]))
biotrainee$gender: female
[1] 25.33333
-----------------------------------------------------------------------------
biotrainee$gender: male
[1] 24.5
by
做了什么吐限?將第一個(gè)參數(shù)(學(xué)徒姓名)按照第二個(gè)參數(shù)(性別)進(jìn)行分組,然后每組應(yīng)用第三個(gè)參數(shù)所定義的函數(shù)(求每組第三列即年齡的平均值)锨天。
還沒(méi)懂毯盈?沒(méi)關(guān)系,來(lái)個(gè)示意圖:
熟悉
split()
函數(shù)的可以看出病袄,按照gender
列分組那步搂赋,split()
函數(shù)可以到達(dá)同樣的效果:split(biotrainee,biotrainee$gender)
> split(biotrainee,biotrainee$gender)
$`female`
name gender ages
2 xj female 24
3 hj female 25
5 xs female 27
$male
name gender ages
1 xg male 23
4 wh male 26
用split()
函數(shù)分好組之后,我們?cè)儆?code>lapply就可以看到:
> lapply(split(biotrainee,biotrainee$gender),function(x) mean(x[,3]))
$`female`
[1] 25.33333
$male
[1] 24.5
lapply()
中的 “l(fā)” 代表list益缠,它接受list
作為輸入脑奠,并將指定的操作應(yīng)用于列表中的所有元素。在list上逐個(gè)元素調(diào)用FUN函數(shù)幅慌∷纹郏可以用于data.frame
上,因?yàn)?code>data.frame是一種特殊形式的list
胰伍。
到這里by()
函數(shù)的用法就講完了齿诞,只講基本用法,不講在實(shí)際數(shù)據(jù)分析過(guò)程中能解決什么問(wèn)題骂租?還是那句話祷杈,不是我的風(fēng)格~
這幾天我在看Jimmy老師在B站上的GEO數(shù)據(jù)挖掘視頻課程,課程里介紹到GEO數(shù)據(jù)挖掘分析流程:看文章找GSE編號(hào) --> 到GEO數(shù)據(jù)庫(kù)搜索下載數(shù)據(jù) --> 提取表達(dá)矩陣exp --> id轉(zhuǎn)換....
在id轉(zhuǎn)換過(guò)程中渗饮,經(jīng)過(guò)一系列處理我們得到了ids但汞,它與我們提取的表達(dá)矩陣exp的探針順序一一對(duì)應(yīng):
> head(ids)
probe_id symbol
1 7896759 LINC01128
2 7896761 SAMD11
3 7896779 KLHL17
4 7896798 PLEKHN1
5 7896817 ISG15
6 7896822 AGRN
> head(exp)
GSM1052615 GSM1052616 GSM1052617 GSM1052618 GSM1052619 GSM1052620
7896759 8.75126 8.61650 8.81149 8.32067 8.41445 8.45208
7896761 8.39069 8.52617 8.43338 9.17284 9.10216 9.14120
7896779 8.20228 8.30886 8.18518 8.13322 8.06453 8.15884
7896798 8.41004 8.37679 8.27521 8.34524 8.35557 8.44409
7896817 7.72204 7.74572 7.78022 7.72308 7.53797 7.73401
7896822 9.19237 9.10929 9.03668 9.94821 9.96994 9.99839
這時(shí),我們就可以對(duì)表達(dá)矩陣exp進(jìn)行分組互站,將同一個(gè)symbol
所對(duì)應(yīng)的多個(gè)探針?lè)殖刹煌慕M私蕾,并對(duì)每組探針進(jìn)行統(tǒng)計(jì):計(jì)算每組中每行探針表達(dá)量的平均值(也就是每個(gè)探針在6個(gè)樣本中表達(dá)量的均值rowMeans(x)),再取平均值最大的那個(gè)探針作為該symbol所對(duì)應(yīng)的唯一探針胡桃,我們上面講的by()
函數(shù)就可以完成以上操作:
tmp = by(exp,
ids$symbol,
function(x) rownames(x)[which.max(rowMeans(x))])
probes = as.character(tmp)
第二個(gè)參數(shù)ids$symbol
定義了分組踩叭,將第一參數(shù)—exp表達(dá)矩陣分成了若干個(gè)小矩陣,每個(gè)小矩陣?yán)锎娣胖粋€(gè)symbol所對(duì)應(yīng)的所有探針翠胰。第三個(gè)參數(shù)是我們自己定義的函數(shù):計(jì)算每個(gè)小矩陣中每行探針表達(dá)量的平均值(也就是每個(gè)探針在6個(gè)樣本中表達(dá)量的均值rowMeans(x)
)容贝,再取平均值最大的那個(gè)探針作為該symbol所對(duì)應(yīng)的唯一探針which.max(rowMeans(x))
。
by()
函數(shù)就可以返回每個(gè)分組里的統(tǒng)計(jì)結(jié)果亡容,即每個(gè)symbol所對(duì)應(yīng)的唯一探針I(yè)Dprobe_id
嗤疯,存放在tmp里。用probes = as.character(tmp)
將結(jié)果變?yōu)榧冏址拖蛄浚?/p>
> head(tmp)
INDICES
A1CF A2M A2ML1 A3GALT2 A4GALT A4GNT
"7933640" "7960947" "7953775" "7914643" "8076497" "8090955"
> head(probes)
[1] "7933640" "7960947" "7953775" "7914643" "8076497" "8090955"
>