2015-04-22 65 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()