2015-04-22 66 views
-1

我有一個矩陣:R:調用函數

x <- cbind(x1 = 3, x2 = c(4:1, 2:5)) 
dimnames(x)[[1]] <- letters[1:8] 

如何以下代碼工作?

cave <- function(x, c1, c2) c(mean(x[c1]), mean(x[c2])) 
apply(x,1, cave, c1="x1", c2=c("x1","x2")) 

特別是我不理解的說法,c(mean(x[c1]), mean(x[c2]))功能cave內。

另外我們用這種方式調用函數cave(x,a,b)。但是在apply函數中,當我們調用cave函數時,輸入是哪裏?

+0

這應該是有用的https://nsaunders.wordpress.com/2010/08/20/a-brief-introduction-to-apply-in-r/ –

+0

請注意,循環行和平均的子集元素的效率低於使用內置矢量化函數執行此類操作的效率。例如,在這種情況下運行'rbind(rowMeans(x [,「x1」,drop = F)),rowMeans(x [,c(「x1」,「x2」)]))「或者,甚至更好,'rbind(x [,「x1」],rowMeans(x [,c(「x1」,「x2」)]))''。 – josliber

回答

2

當你定義一個函數時,列出的最後一件事情是隱式返回的。因此,當定義爲cave

cave <- function(x, c1, c2) { 
    c(mean(x[c1]), mean(x[c2])) 
} 

這是相同的

cave <- function(x, c1, c2) { 
    return(c(mean(x[c1]), mean(x[c2]))) 
} 

在R,矢量是通過使用串聯c()元件限定。因此c(a, b)使用元素ab作出長度爲2的向量。在這種情況下,a是在由c1給出的指數處的輸入x的平均值,並且b是在由c2給出的指數處的x的平均值。

當你apply()此功能x在尺寸1,你對x每一行計算cave()

apply()的語法如下:

apply(x, # object input to the function 
     1, # dimension of x over which to apply the function, 1=rows, 2=columns 
     cave, # function to apply 
     c1="x1", c2=c("x1", "x2") # any further arguments to the function 
    ) 

應用cave()第一行給了我們由x1平均的(這只是x1因爲它是一個單數的平均值)的矢量和平均值爲x1x2。 3的平均值是3,3和4的平均值是3.5,所以輸出是c(3, 3.5)

我們重複,每行x,並最終我們得到這樣的:

 a b c d e f g h 
[1,] 3.0 3 3.0 3 3.0 3 3.0 3 
[2,] 3.5 3 2.5 2 2.5 3 3.5 4 

你可以看到的xa一行列a對應cave()