本帖最后由 大鱼 于 2013-12-29 15:04 编辑
大家好,我是一个刚接触R语言新手,对很多概念不是很理解。
今天我在看一段程序的时候遇到一句代码,如下:
apply(data, 1, FUN=function(x){x%*%t(x)})
我查看文档以后对该语句的理解是,对data数据每一行调用一次function,并将该行做为参数传递给function.而x%*%t(x)应该是矩阵乘法的意思。
但是在计算中我发现了问题,例如:
我令data=matrix(seq(1,4),1,4)
> data
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
> apply(data, 1, FUN=function(x){x%*%t(x)})
[,1]
[1,] 1
[2,] 2
[3,] 3
[4,] 4
[5,] 2
[6,] 4
[7,] 6
[8,] 8
[9,] 3
[10,] 6
[11,] 9
[12,] 12
[13,] 4
[14,] 8
[15,] 12
[16,] 16
上面是我输入命令以后的结果,这个结果让我十分不解,按照我的想法来讲,我觉得应该只返回一个数。
因为data只有一行,data与它的转置相乘应该是一个数才对。但是它竟然返回了16行1列的矩阵,我觉得十分疑惑。
我想请教大家,这种结果是怎么发生的?我在理解这句代码上有哪些误区?
——————————————————————————————————————————————————————————————————
问题已经自己解决,话说论坛的人气怎么这么低。
我把自己的想法写在下面,如果有人有和我一样的问题的话应该是能够解决的。
首先我理解的每次在data数据中提取一行的想法是对的,但是提取的每一行数据已经不是矩阵,而是一个一维的数组。
在function中,t(x)将一维数组转为一个矩阵,如果x是一个矩阵,返回的是x的转置,关于这个t函数的这个性质,可以很容易的在帮助文档中找到。所以x%*%t(x)的意思就变为 序列*矩阵。%*%是矩阵乘法的意思 ,x中的每一个数都会乘上一次t(x).
例如在上面的例子中
> x = seq(1,4)
> x
[1] 1 2 3 4.
>t(x) =
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
>x%*%t(x)
[,1] [,2] [,3] [,4]
[1,] 1 2 3 4
[2,] 2 4 6 8
[3,] 3 6 9 12
[4,] 4 8 12 16
从这里可以看出,元素个数是16个,但是为什么在用apply函数时会变成1列呢?下面会回答这个问题。
apply函数会返回一个矩阵,矩阵的列标记的是处理的行数的序号,在这个例子中,data数据只有一行,所以返回值只有一列,并把所有得到的结果放到这一列中。为了证明这一点,我做了一个实验。
> data =matrix(0,2,3)
> data[1,1:3] = 1:3
> data[2,1:3] = 1:3
> data
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 1 2 3
> apply(data, 1, FUN=function(x){x%*%t(x)})
[,1] [,2]
[1,] 1 1
[2,] 2 2
[3,] 3 3
[4,] 2 2
[5,] 4 4
[6,] 6 6
[7,] 3 3
[8,] 6 6
[9,] 9 9
可以看出,返回值矩阵的列确实是按照data的行数组织的。
如果apply第二个参数时2,则apply按照data的列调用function,按照这样的话返回值应该是3列。
经过实验确实时这样。如下:
> apply(data, 2, FUN=function(x){x%*%t(x)})
[,1] [,2] [,3]
[1,] 1 4 9
[2,] 1 4 9
[3,] 1 4 9
[4,] 1 4 9
总结:
经过实验和验证,这个问题得到了解决。因为我也是接触R语言,很多问题还要向大家请教。
所以如果有什么问题或者更正的话,可以通过我的邮箱联系dayu2014@gmail.com
|