R軟體的資料排列

R 是以行來排列資料的語言,舉例來說:先建一 3X4 的二維矩陣。

> x <- matrix(1:12,3,4); x

矩陣中的資料預設就是依序以行來排列完成。今欲計算每列四筆資料的平均數與中位數,運用 apply 函數如下:

> myMeanNMedian <- function(x) (mean(x), median(x))

> y <- apply(x, 1, myMeanNMedian);y

 

讀者可看到各列的平均數與中位數也是以縱行的方式依序排列。apply 函數也可以計算每行三筆資料的平均數與中位數:

> z <- apply(x, 2, myMeanNMedian); z

 

此處各行的平均數與中位數還是以縱行的方式依序排列。瞭解其排列方式後我們可以將其各列與各行命名:

> dimnames(y)1 <- c('Mean', 'Median')

> dimnames(y)2 <- c(paste('Row', 1:3, sep=' '))

> dimnames(z)2 <- c(paste('Column', 1:4, sep=' '))

 

也可以將 y 轉置一下

> t(y)

y 與 t(y)哪一種呈現方式較符合您的直覺呢?

 

資料來源:Spector, P. (2008), Data Manipulationwith R,Springer.

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

R軟體如何儲存隨機種子?

R是一個很好的模擬工具,有許多內建函數可資運用。使用者有時希望獲得相同的模擬結果,則可將隨機種子(random seed)儲存起來重複利用。例如:

> set.seed(12)
> seed <- .Random.seed
> x <- runif(10)
> .Random.seed <- seed
> y <- runif(10) x-y

[1] 0 0 0 0 0 0 0 0 0 0

 

讀者會發現兩次模擬的十筆均勻分配資料是一樣的。

如果要在兩次 R sessions中獲得相同的模擬結果,首先請輸入:

> # seesion 1

> set.seed(10)

> seed <- .Random.seed

> x<-runif(10)

 

將第一個 session 的結果儲存起來後離開 R:

> write.table(x, "x")

>write.table(seed, "seed")

> q( )

 

重新開啓 R,在第二個session 輸入:

> # session 2

> x <- read.table("x")

> seed <- read.table("seed")

> .Random.seed <- t(seed)

> y <- runif(10)

> x - y

                    x

1       3.330669e-16

2       3.330669e-16

3       -2.220446e-16

4       -4.440892e-16

5       2.775558e-17

6       -1.110223e-16

7       2.220446e-16

8       -1.665335e-16

9       -3.330669e-16

10     1.110223e-16

讀者會發現兩次 sessions 模擬的結果幾乎沒有差異!

 

參考資料:http://lists.cs.wisc.edu/archive/stat-forum/2007-March/msg00004.shtm/

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

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