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軟體如何儲存隨機種子?
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軟體apply系列基本函數的運用
資料分析經常需要運用for 迴圈反覆執行某項工作,然而R 程式中卻不可用太多的迴圈,否則會大大降低程式執行的效率!以紐約市空氣品質資料為例,其為包含六個變數的154 筆資料,以apply 函數可以輕易地計算出各行變數的平均值。
> head(airquality)
> apply(airquality, 2, mean) # apply(資料及名稱, 2表逐行,套用函數名稱
結果中出現NA 的是因為該變數原始資料有遺缺值,此時可將遺缺值NA 排除計算(i.e. na.rm = T)即可。
> apply(airquality, 2, mean, na.rm=T)
同理,讀者可以 apply(airquality, 1, mean)逐列求出154 筆觀測值的平均值(此統計值有意義嗎?)
apply 系列的基本函數還有lapply 與sapply,lapply 將airquality 資料視為六個元素的串列(list),逐一元素加總遺缺值個數,故無須加入逐列或逐行的參數值。
> lapply(airquality, function(x) sum(is.na(x)))
sapply 可將上面結果以較簡單的矩陣形式展現,此即為函數名字首的含義。
> sapply(airquality, function(x) sum(is.na(x)))
sapply 函數也可以判斷哪些變數是因子,或加入自定函數計算因子變數的水準數,讀者當可想出apply系列基本函數的其它應用。最後,善用apply 方可將R 程式技巧提升到更高的層次。
>sapply(InsectSprays, is.factor)
> sapply(insectSprays, sunction(x) if (!is.factor(x)) return(0) else length(levels(x)))
參考資料:
Maindonald, J.H. (2004), Using R for Data Analysis and Graphics: Introduction, Code,and Commentary, http://www.stats.uwo.ca/DAAG/.
撰文者: |