有些內容使用中英雙語,有些只有英文或中文。歡迎使用與分享任何內容,但先來信告知並標示此部落格為出處。
Some parts use both Chinese and English, but some parts use only one language. Feel free to share, but please contact me first and list this blog as your reference.

2014年8月8日 星期五

Coursera 上課筆記 - R Programming - 第三週 - Apply Function

Course note for R programming -  apply function
R programming 第三週的筆記之一!  For 未來查看我學過什麼+複習XD


Apply function:


lapply(list, fun): 接收一個 list 把fun作用到整個list上 回傳list
ex: lapply(x, mean)

sapply(list, fun): 接收一個list, 迴船可以簡化的版本
如果長度都為一,回傳vector
如果長度相同,回傳matrix
如果無法判斷 回傳list

apply(matrix, Margin, fun)

margin: 代表維度 for a matrix 1 indicates rows, 2 indicates columns, c(1, 2)
這是要保留的維度

rowSums = apply(x, 1, sum)
rowMeans = apply(x, 1, mean)
colSums = apply(x, 2, sum)
colMeans = apply(x, 2, mean)
要算普通的sum/ mean 用上面這些,比用apply快

a <- array(rnorm(2*2*10), c(2,2 ,10))
apply(a, c(1, 2), mean) #保留1, 2 dimention, 結合第三維度
等同於
rowMeans(a, dim = 2)

tapply用在vector, subset: 一樣會簡化(向sapply)
前面是給訂的list data, 中間是index, 可以依照index的數值,
決定要怎麼使用function在前面的資料(像是1,1,1,3,4,2,2,3,4,3之類的)
tapply(list, list, fun)
ex: tapply(x, f, mean)

gl(3, 5): generate level
1 1 1 1 1 2 2 2 2 2 3 3 3 3 3
產生三個level, 每個level 重複5次


split(x, f, drop = FALSE, ...)
可以把group分裂成f的樣子,回傳list
可以跟split合用,像是 lapply(split(x, f), mean)

**** ex:
s <- split(airquality, airquality$Month)
lapply(s, function(x) colMeans(x[, c("Ozone", "Solar.R", "Wind")]))
把資歷依照月份分開成一個list!!

sapply(s, function(x) colMeans(x[, c("Ozone", "Solar.R", "Wind")], na.rm = TRUE))

str(split(x, list(f1, f2)))
後面的list可以是多種factor集合
 str(split(x, list(f1, f2), drop = TRUE)) 會丟掉空白的empty level


mapply 用在很像是多重的lapply, sapply
但是是可以多重的使用function, 此function可以return list
可以在此function的argument打 vector形式

list(rep(1, 4), rep(2, 3), rep(3, 2), rep(4, 1))
會等於
mapply(rep, 1:4, 4:1)

試試 mapply(rep, 1:4, 9:6)
[[1]]
[1] 1 1 1 1 1 1 1 1 1

[[2]]
[1] 2 2 2 2 2 2 2 2

[[3]]
[1] 3 3 3 3 3 3 3

[[4]]
[1] 4 4 4 4 4 4



If you want to use (copy, paste or quote) my original article, please contact me through email. (autek.roy@gmail.com) If there is any mistake or comment, please let me know. :D

如要使用(複製貼上或轉載)作者原創文章, 請來信跟我聯絡。(autek.roy@gmail.com) 如果有發現任何的錯誤與建議請留言或跟我連絡。 : )

沒有留言:

張貼留言

請留下您的任何想法或建議!
Please leave any thought or comment!