R語言中apply函數(shù)家族

R語言提供了批量處理函數(shù)跋核,可以循環(huán)遍歷某個集合內(nèi)的所有或部分元素,以簡化操作叛买。

這些函數(shù)底層是通過C來實(shí)現(xiàn)的砂代,所以效率也比手工遍歷來的高效。
批量處理函數(shù)有很重要的apply族函數(shù):lapply sapply apply tapply mapply率挣。apply族函數(shù)是高效能計(jì)算的運(yùn)算向量化(Vectorization)實(shí)現(xiàn)方法之一刻伊,比起傳統(tǒng)的for,while常常能獲得更好的性能。
apply : 用于遍歷數(shù)組中的行或列椒功,并且使用指定函數(shù)來對其元素進(jìn)行處理捶箱。
lapply : 遍歷列表向量內(nèi)的每個元素,并且使用指定函數(shù)來對其元素進(jìn)行處理动漾。返回列表向量丁屎。
sapply : 與lapply基本相同,只是對返回結(jié)果進(jìn)行了簡化旱眯,返回的是普通的向量晨川。
mapply: 支持傳入兩個以上的列表。

tapply: 接入?yún)?shù)INDEX删豺,對數(shù)據(jù)分組進(jìn)行運(yùn)算共虑,就和SQL中的by group一樣。

(1)行或列遍歷操作函數(shù)apply

apply(X, MARGIN, FUN, ...)

參數(shù):

   X: an array, including a matrix.

MARGIN: 1:行操作呀页; 2:列操作

FUN:函數(shù)名

用apply可以很方便地按行列求和/平均妈拌,其結(jié)果與colMeans,colSums,rowMeans,rowSums是一樣的。

舉例如下:

a<-matrix(1:12,c(3,4))
a
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
apply(a,1,sum)
[1] 22 26 30
apply(a,2,sum)
[1] 6 15 24 33
apply(a,1,function(x) sum(x)+2)
[1] 24 28 32
apply(a,1,function(x) x^2)
[,1] [,2] [,3]
[1,] 1 4 9
[2,] 16 25 36
[3,] 49 64 81
[4,] 100 121 144

(2)列表(list)遍歷函數(shù)lapply

lapply(list, function, ...)
特點(diǎn):對每列進(jìn)行操作蓬蝶,非常適合數(shù)據(jù)框供炎;輸入的數(shù)據(jù)必須是list型渴逻。

a<-matrix(1:12,c(3,4))
a
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
a.df<-data.frame(a)
a
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
is.list(a.df)
[1] TRUE
str(a.df)
'data.frame': 3 obs. of 4 variables:
X1: int 1 2 3 X2: int 4 5 6
X3: int 7 8 9 X4: int 10 11 12
lapply(a.df, function(x) x+3)
X1 [1] 4 5 6X2
[1] 7 8 9
X3 [1] 10 11 12X4
[1] 13 14 15
lapply(a.df, function(x) sum(x)+3)
X1 [1] 9X2
[1] 18
X3 [1] 27X4
[1] 36
y<-lapply(a.df, function(x) sum(x)+3)
is.list(y)
[1] TRUE
names(y)
[1] "X1" "X2" "X3" "X4"
y
X1 [1] 9X2
[1] 18
X3 [1] 27X4
[1] 36
y[1]
X1 [1] 9 y[[1]] [1] 9 yX1
[1] 9

(3)sapply

sapply(list, function, ..., simplify)
simplify=F:返回值的類型是list,此時與lapply完全相同
simplify=T(默認(rèn)值):返回值的類型由計(jì)算結(jié)果定音诫,如果函數(shù)返回值長度為1惨奕,則sapply將list簡化為vector;
如果返回的列表中每個元素的長度都大于1且長度相同竭钝,那么sapply將其簡化位一個矩陣

yy<-sapply(a.df, function(x) x^2)
yy
X1 X2 X3 X4
[1,] 1 16 49 100
[2,] 4 25 64 121
[3,] 9 36 81 144
str(yy)
num [1:3, 1:4] 1 4 9 16 25 36 49 64 81 100 ...

  • attr(*, "dimnames")=List of 2
    ..: NULL .. : chr [1:4] "X1" "X2" "X3" "X4"

str(y)
List of 4
X1: num 9 X2: num 18
X3: num 27 X4: num 36

yy<-sapply(a.df, function(x,y) x^2+y, y=3)
yy
X1 X2 X3 X4
[1,] 4 19 52 103
[2,] 7 28 67 124
[3,] 12 39 84 147> y1<-sapply(a.df, sum)
y1
X1 X2 X3 X4
6 15 24 33
str(y1)
Named int [1:4] 6 15 24 33

  • attr(*, "names")= chr [1:4] "X1" "X2" "X3" "X4"

y1<-sapply(a.df, sum,simplify=F)
y1
$X1
[1] 6

$X2
[1] 15

$X3
[1] 24

$X4
[1] 33

str(y1)
List of 4
X1: int 6 X2: int 15
X3: int 24 X4: int 33

(4)mapply:mapply是sapply的多變量版本(multivariate sapply)梨撞,Apply a Function to Multiple List or Vector Arguments

mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE)

mapply(function(x,y) x^y, c(1:5), c(1:5))
[1] 1 4 27 256 3125
a<-matrix(1:12,c(3,4))
a
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
mapply(sum, a[,1],a[,3],a[,4])
[1] 18 21 24

mapply(function(x,y,z) x^2+y+z, a[,1],a[,3],a[,4])
[1] 18 23 30

(5) tapply(X, INDEX, FUN = NULL, ..., simplify = TRUE)

x是需要處理的向量,INDEX是因子(因子列表)香罐,F(xiàn)UN是需要執(zhí)行的函數(shù)卧波,simplify指是否簡化輸入結(jié)果(考慮sapply對于lapply的簡化)

補(bǔ)充個因子函數(shù)gl,它可以很方便的產(chǎn)生因子庇茫,在方差分析中經(jīng)常會用到

gl(3,5) 3是因子水平數(shù)港粱,5是重復(fù)次數(shù)
[1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
Levels: 1 2 3
gl(3,1,15) 15是結(jié)果的總長度
[1] 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3
Levels: 1 2 3

df <- data.frame(year=kronecker(2001:2003, rep(1,4)), loc=c('beijing','beijing','shanghai','shanghai'), type=rep(c('A','B'),6), sale=rep(1:12))
df
year loc type sale
1 2001 beijing A 1
2 2001 beijing B 2
3 2001 shanghai A 3
4 2001 shanghai B 4
5 2002 beijing A 5
6 2002 beijing B 6
7 2002 shanghai A 7
8 2002 shanghai B 8
9 2003 beijing A 9
10 2003 beijing B 10
11 2003 shanghai A 11
12 2003 shanghai B 12
tapply(dfsale,df[,c('year','loc')],sum) loc year beijing shanghai 2001 3 7 2002 11 15 2003 19 23 tapply(dfsale,df[,c('type','loc')],sum)
loc
type beijing shanghai
A 15 21
B 18 24

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市旦签,隨后出現(xiàn)的幾起案子查坪,更是在濱河造成了極大的恐慌,老刑警劉巖宁炫,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件偿曙,死亡現(xiàn)場離奇詭異,居然都是意外死亡羔巢,警方通過查閱死者的電腦和手機(jī)望忆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竿秆,“玉大人启摄,你說我怎么就攤上這事∮母郑” “怎么了鞋仍?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長搅吁。 經(jīng)常有香客問我,道長落午,這世上最難降的妖魔是什么谎懦? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮溃斋,結(jié)果婚禮上界拦,老公的妹妹穿的比我還像新娘。我一直安慰自己梗劫,他們只是感情好享甸,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布截碴。 她就那樣靜靜地躺著,像睡著了一般蛉威。 火紅的嫁衣襯著肌膚如雪日丹。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天蚯嫌,我揣著相機(jī)與錄音哲虾,去河邊找鬼。 笑死择示,一個胖子當(dāng)著我的面吹牛束凑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播栅盲,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼汪诉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了谈秫?” 一聲冷哼從身側(cè)響起扒寄,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎孝常,沒想到半個月后旗们,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡构灸,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年上渴,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喜颁。...
    茶點(diǎn)故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡稠氮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出半开,到底是詐尸還是另有隱情隔披,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布寂拆,位于F島的核電站奢米,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏纠永。R本人自食惡果不足惜鬓长,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望尝江。 院中可真熱鬧涉波,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至窗声,卻和暖如春相恃,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嫌佑。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工豆茫, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人屋摇。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓揩魂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親炮温。 傳聞我的和親對象是個殘疾皇子火脉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評論 2 355