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!