apply、lapply备埃、sapply溜腐、mapply、tapply函數(shù)

簡介
批量處理函數(shù)有很重要的apply族函數(shù):lapply sapply apply tapply mapply瓜喇。這些函數(shù)底層通過C實現(xiàn),效率比手工遍歷高效歉糜。apply族函數(shù)是高效能計算的運算向量化(Vectorization)實現(xiàn)方法之一乘寒,比起傳統(tǒng)的for,while常常能獲得更好的性能。

apply : 用于遍歷數(shù)組中的行或列匪补,并且使用指定函數(shù)來對其元素進行處理伞辛。
lapply : 遍歷列表向量內的每個元素烂翰,并且使用指定函數(shù)來對其元素進行處理。返回列表向量蚤氏。
sapply : 與lapply基本相同甘耿,只是對返回結果進行了簡化,返回的是普通向量竿滨。
mapply: 支持傳入兩個以上的列表佳恬。
tapply: 接入參數(shù)INDEX,對數(shù)據(jù)分組進行運算于游,就和SQL中的by group一樣毁葱。
apply函數(shù)
對矩陣、數(shù)據(jù)框贰剥、數(shù)組(二維倾剿、多維)等矩陣型數(shù)據(jù),按行或列應用函數(shù)FUN進行循環(huán)計算蚌成,并以返回計算結果前痘。
apply(X, MARGIN, FUN, …)

X:數(shù)組、矩陣担忧、數(shù)據(jù)框等矩陣型數(shù)據(jù)
MARGIN:按行計算或按列計算芹缔,1表示按行,2表示按列
FUN:自定義的調用函數(shù)涵妥,如mean/sum等(其結果與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,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

lapply函數(shù)
對列表乖菱、數(shù)據(jù)框按列進行循環(huán),輸入必須為列表(list)蓬网,返回值為列表(list)窒所。
lapply(X, FUN, …)

X:列表、數(shù)據(jù)框
FUN:自定義的調用函數(shù)
b<-list(x = 1:10, y = matrix(1:12, 3, 4))
$x
[1] 1 2 3 4 5 6 7 8 9 10

y [,1] [,2] [,3] [,4] [1,] 1 4 7 10 [2,] 2 5 8 11 [3,] 3 6 9 12 1 2 3 4 5 6 7 8 9 lapply(b, sum) #求列表中各元素的和x
[1] 55

$y
[1] 78
1
2
3
4
5
6

a=data.frame(matrix(1:12,c(3,4)))
a
X1 X2 X3 X4
1 1 4 7 10
2 2 5 8 11
3 3 6 9 12
names(a)
[1] "X1" "X2" "X3" "X4"
str(a)
'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, function(x) x+3)
$X1
[1] 4 5 6

$X2
[1] 7 8 9

$X3
[1] 10 11 12

$X4
[1] 13 14 15

a1 <- lapply(a, function(x) sum(x)+3)
a1
$X1
[1] 9

$X2
[1] 18

$X3
[1] 27

$X4
[1] 36

a1[1]
$X1
[1] 9

a1[[1]]
[1] 9
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
sapply函數(shù)
類似于lapply函數(shù)帆锋,但輸入為列表(list)吵取,返回值為向量。
sapply(X, FUN, …,simplify )

X:列表锯厢、矩陣皮官、數(shù)據(jù)框
FUN:自定義的調用函數(shù)
simplify=F:返回值的類型是list,此時與lapply完全相同
simplify=T(默認值):返回值的類型由計算結果定实辑,如果函數(shù)返回值長度為1捺氢,則sapply將list簡化為vector;如果返回的列表中每個元素的長度都大于1且長度相同剪撬,那么sapply將其簡化位一個矩陣

a=data.frame(matrix(1:12,c(3,4)))
a #"list"
X1 X2 X3 X4
1 1 4 7 10
2 2 5 8 11
3 3 6 9 12
str(a)
'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
a2 <- lapply(a, function(x) x+3)
a2 #"list"
$X1
[1] 4 5 6

$X2
[1] 7 8 9

$X3
[1] 10 11 12

$X4
[1] 13 14 15

str(a2)
List of 4
X1: num [1:3] 4 5 6 X2: num [1:3] 7 8 9
X3: num [1:3] 10 11 12 X4: num [1:3] 13 14 15
a3 <- sapply(a, function(x) x^2)
a3 #"numeric"
X1 X2 X3 X4
[1,] 1 16 49 100
[2,] 4 25 64 121
[3,] 9 36 81 144
str(a3)
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"
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42

b<-list(x = 1:10, y = matrix(1:12, 3, 4))
sapply(b, sum)
x y
55 78
1
2
3
4
sapply函數(shù)可提取列表中數(shù)據(jù)

y<-c("100-D","100-A","110-c","110-A")
z<-strsplit(y,"-")
sapply(z,"[",1) #提取列表第1個元素
sapply(z,"[",2) #提取列表中第2個元素
1
2
3
4
第一行:定義一個向量y
第二行:使用strsplit函數(shù)對向量y 按照“-”符號進行分割摄乒,得到一個列表z
第三行:使用sapply函數(shù)提取列表z的第1個和第2個位置元素,輸出結果如下:
1
2
3
[1] "100" "100" "110" "110"

sapply(z,"[",2) #提取列表中第2個元素
[1] "D" "A" "c" "A"
1
2
3
mapply函數(shù)
mapply是sapply的多變量版本(multivariate sapply)。
mapply(FUN, …, MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE)

a <- mapply(function(x,y) x^y, c(1:5), c(1:5))
a
[1] 1 4 27 256 3125
mode(a)
[1] "numeric"
str(a)
num [1:5] 1 4 27 256 3125
names(a)
NULL
b<-matrix(1:12,c(3,4),dimnames=list(c("a","b","c"),c("A","B","C","D")))
b
A B C D
a 1 4 7 10
b 2 5 8 11
c 3 6 9 12
mapply(sum, b[,1],b[,3],b[,4])

a b c
18 21 24

mapply(sum,b[1,],b[2,],b[3,])
A B C D
6 15 24 33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
tapply函數(shù)
將數(shù)據(jù)按照不同方式分組馍佑,生成類似列聯(lián)表形式的數(shù)據(jù)結果斋否。
tapply(X, INDEX, FUN = NULL, …, default = NA, simplify = TRUE)

X:數(shù)組、矩陣拭荤、數(shù)據(jù)框等分割型數(shù)據(jù)向量
INDEX:一個或多個因子的列表(因子列表)茵臭,每個因子的長度都與x相同
FUN: 自定義的調用函數(shù)
simplify指是否簡化輸入結果(考慮sapply對于lapply的簡化)
代碼舉例

manager <- c(1, 2, 3, 4, 5)
country <- c("US", "US", "UK", "UK", "UK")
gender <- c("M", "F", "F", "M", "F")
age <- c(32, 45, 25, 39, 99)
leadership <- data.frame(manager, country, gender, age)
tapply(leadershipage, leadershipcountry, mean) #求在不同country水平下的age的均值

tapply(leadershipage, list(leadershipcountry, leadership$gender), mean) #求在不同country和gender交叉水平下的age的均值, 輸出得到矩陣數(shù)據(jù)
1
2
3
4
5
6
7
8
輸出結果

 UK       US 

54.33333 38.50000

F  M

UK 62 39
US 45 32
————————————————

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末舅世,一起剝皮案震驚了整個濱河市旦委,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌歇终,老刑警劉巖社证,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異评凝,居然都是意外死亡追葡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門奕短,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宜肉,“玉大人,你說我怎么就攤上這事翎碑∶担” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵日杈,是天一觀的道長遣铝。 經常有香客問我,道長莉擒,這世上最難降的妖魔是什么酿炸? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮涨冀,結果婚禮上填硕,老公的妹妹穿的比我還像新娘。我一直安慰自己鹿鳖,他們只是感情好扁眯,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翅帜,像睡著了一般姻檀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涝滴,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天施敢,我揣著相機與錄音周荐,去河邊找鬼。 笑死僵娃,一個胖子當著我的面吹牛,可吹牛的內容都是我干的腋妙。 我是一名探鬼主播默怨,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼骤素!你這毒婦竟也來了匙睹?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤济竹,失蹤者是張志新(化名)和其女友劉穎痕檬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體送浊,經...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡梦谜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了袭景。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片唁桩。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖耸棒,靈堂內的尸體忽然破棺而出荒澡,到底是詐尸還是另有隱情,我是刑警寧澤与殃,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布单山,位于F島的核電站,受9級特大地震影響幅疼,放射性物質發(fā)生泄漏米奸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一衣屏、第九天 我趴在偏房一處隱蔽的房頂上張望躏升。 院中可真熱鬧,春花似錦狼忱、人聲如沸膨疏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽佃却。三九已至,卻和暖如春窘俺,著一層夾襖步出監(jiān)牢的瞬間饲帅,已是汗流浹背复凳。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留灶泵,地道東北人育八。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像赦邻,于是被迫代替她去往敵國和親髓棋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內容