R軟體apply系列基本函數的運用

資料分析經常需要運用for 迴圈反覆執行某項工作,然而R 程式中卻不可用太多的迴圈,否則會大大降低程式執行的效率!以紐約市空氣品質資料為例,其為包含六個變數的154 筆資料,以apply 函數可以輕易地計算出各行變數的平均值。

> head(airquality)

f:id:DataScience:20140810131628p:plain

 

> apply(airquality, 2, mean) # apply(資料及名稱, 2表逐行,套用函數名稱

f:id:DataScience:20140810131917p:plain

 

結果中出現NA 的是因為該變數原始資料有遺缺值,此時可將遺缺值NA 排除計算(i.e. na.rm = T)即可。

> apply(airquality, 2, mean, na.rm=T)

f:id:DataScience:20140810132132p:plain

 

同理,讀者可以 apply(airquality, 1, mean)逐列求出154 筆觀測值的平均值(此統計值有意義嗎?)

apply 系列的基本函數還有lapply 與sapply,lapply 將airquality 資料視為六個元素的串列(list),逐一元素加總遺缺值個數,故無須加入逐列或逐行的參數值。

 

> lapply(airquality, function(x) sum(is.na(x)))

   f:id:DataScience:20140810132626p:plain

sapply 可將上面結果以較簡單的矩陣形式展現,此即為函數名字首的含義。

> sapply(airquality, function(x) sum(is.na(x)))

f:id:DataScience:20140810132851p:plain

 

sapply 函數也可以判斷哪些變數是因子,或加入自定函數計算因子變數的水準數,讀者當可想出apply系列基本函數的其它應用。最後,善用apply 方可將R 程式技巧提升到更高的層次。

>sapply(InsectSprays, is.factor)

f:id:DataScience:20140810133424p:plain

> sapply(insectSprays, sunction(x) if (!is.factor(x)) return(0) else length(levels(x))) 

f:id:DataScience:20140810133628p:plain

 

 參考資料:

 Maindonald, J.H. (2004), Using R for Data Analysis and Graphics: Introduction, Code,and Commentary, http://www.stats.uwo.ca/DAAG/.

 

撰文者:
鄒慶士 博士
現任:
北商資訊與決策科學所教授
中華 R 軟體學會理事長
信箱:
vince.tsou@gmail.com