今天的内容应该算是比较简单的,如果看着看着觉得复杂了,那绝对是被我乱整给整复杂的

r语言的运算法则(R语言第30篇组合数)(1)

咱提个简单明了的问题先,知道协方差矩阵不?或者相关系数矩阵也行,反正这俩长得差不多

R里头提供的cov和cor可以直接产生协方差或相关系数的矩阵,但有点了解的亲们应该知道,这种显示方式从表格形式来说是一种宽格式,而且对角线两边的数是重复的,也就是说它虽然显示得好看,但要后续做提取啥的还是有点小繁琐的,尤其是当我们希望提取出数值的同时还要带上相关的标题,那更是格式转着转着,一不小心就找不着了

上例子:

r语言的运算法则(R语言第30篇组合数)(2)

从cov和cor的帮助文件里,咱可以看到一点端倪,那就是它其实支持两种输入方式,一种是像上面这样把整个二维表放进去作为x,这时计算出来的是协方差矩阵,还有一种是同时输入x和y,但两者都是向量,这样计算结果就只有一个数值

r语言的运算法则(R语言第30篇组合数)(3)

如果像上边那样需要3列数据间的协方差,但又不想用宽格式来显示的话,那咱需要的表至少得包含两部分:

1) 由三列数据的列标题两两组合得到的信息列

2) 由标题组合计算出来的协方差

先上手做第一部分,3列标题两两组合,意味着是3个中抽取两个,用函数choose可以先预判下这个组合的长度(这个不是必要步骤,可以省略),而用函数combn可以直接生成组合后的矩阵

Index <- names(Table1[,c(-1,-3)]) #抽取出3列的标题

COVlist <- combn(x = Index,m = 2) #两两组合,抽取数为2

r语言的运算法则(R语言第30篇组合数)(4)

输出的形式行列方向是反的,所以后边做的时候都加了转置函数t()

接下来写得有点长,做完才发觉自己不知不觉的就挖了个坑把自己埋了

#按列名称从Table1中提取数据的function

Pickout <- function(x) {Table1[,colnames(Table1) == x]}

Inputlist <- apply(t(COVlist),c(1,2),Pickout) #把Table1提取出来的6列组成3 3的一个list

COVwithPick <- function (x) {cov(Inputlist[,,1][,x],Inputlist[,,2][,x])}

#做个提取指定列的function计算协方差cov

Value <- apply(data.frame(c(1:3)),1,COVwithPick)

#把标题和协方差计算结果合并到一起

COVresult <- data.frame(t(COVlist),Value)

r语言的运算法则(R语言第30篇组合数)(5)

做倒是做出结果来了,3列两两组合出三个协方差,就是步骤嘛,看着有点费事

啊咧~~~早知道费这劲我还用啥组合数列呀,唉~~~~

,