今天的内容應該算是比較簡單的,如果看着看着覺得複雜了,那絕對是被我亂整給整複雜的
咱提個簡單明了的問題先,知道協方差矩陣不?或者相關系數矩陣也行,反正這倆長得差不多
R裡頭提供的cov和cor可以直接産生協方差或相關系數的矩陣,但有點了解的親們應該知道,這種顯示方式從表格形式來說是一種寬格式,而且對角線兩邊的數是重複的,也就是說它雖然顯示得好看,但要後續做提取啥的還是有點小繁瑣的,尤其是當我們希望提取出數值的同時還要帶上相關的标題,那更是格式轉着轉着,一不小心就找不着了
上例子:
從cov和cor的幫助文件裡,咱可以看到一點端倪,那就是它其實支持兩種輸入方式,一種是像上面這樣把整個二維表放進去作為x,這時計算出來的是協方差矩陣,還有一種是同時輸入x和y,但兩者都是向量,這樣計算結果就隻有一個數值
如果像上邊那樣需要3列數據間的協方差,但又不想用寬格式來顯示的話,那咱需要的表至少得包含兩部分:
1) 由三列數據的列标題兩兩組合得到的信息列
2) 由标題組合計算出來的協方差
先上手做第一部分,3列标題兩兩組合,意味着是3個中抽取兩個,用函數choose可以先預判下這個組合的長度(這個不是必要步驟,可以省略),而用函數combn可以直接生成組合後的矩陣
Index <- names(Table1[,c(-1,-3)]) #抽取出3列的标題
COVlist <- combn(x = Index,m = 2) #兩兩組合,抽取數為2
輸出的形式行列方向是反的,所以後邊做的時候都加了轉置函數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)
做倒是做出結果來了,3列兩兩組合出三個協方差,就是步驟嘛,看着有點費事
啊咧~~~早知道費這勁我還用啥組合數列呀,唉~~~~
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!