[英]create a frequency matrix from a 4 dim matrix in R
我有一個k * 4維度的矩陣,每行都是(1:20,1:20,1:20,1:20)
的組合之一,並指定四倍體節點的類型。 例如對於k=3
我有3個四面體,這里的節點類型
X <- matrix(c(1, 3, 1 ,4,
2, 5, 6 ,1,
12,20,15 ,3), 3,4,byrow=T)
現在,我想從中創建一個暗20 * 8000的頻率表,該頻率表記錄與其余三個節點接觸的每個節點的頻率。 另一方面,我想知道四元組中的每個節點都與哪種類型的節點接觸。
例如,對於第一行,我在F的第1,(1,3,4)個中有一個,在3,(1,1,4)和4,(1,1,3)中也有一個。
我希望我能很好地解釋我的問題。 請幫助我進行此轉換的代碼
注意:由於我的X矩陣的第一行是1,3,1,4,因此輸出矩陣(F)應該在
F[1,which(colnames(F)=="1 3 4") <- F[1,which(colnames(F)=="1 3 4") +1
F[1,which(colnames(F)=="1 3 4") <- F[1,which(colnames(F)=="1 3 4") +1
F[3,which(colnames(F)=="1 1 4") <- F[3,which(colnames(F)=="1 1 4") +1
F[4,which(colnames(F)=="1 1 3") <- F[4,which(colnames(F)=="1 1 3")+1
這意味着每行的4行中的頻率矩陣要加4,而2、3或4可能相同。 例如,由於在第一行中重復了一個,因此將兩個記錄添加到F [1,((colnames(F)==“ 1 3 4”))
我不確定我是否理解,如果知道的話,那么您沒有正確執行此操作,因為您沒有正確訂購三胞胎,所以這是一個猜測。 我認為向量c(3,1,4)應該不同於向量c(1,3,4)。 如果我錯了,請糾正我。
我認為嘗試使用20 ^ 4數組過於繁瑣,因此我構建了一個適合5 ^ 4數組的輸入矩陣:
X <- matrix(c(1, 3, 1 ,4,
2, 5, 2 ,1,
3, 2, 5 ,4), 3,4, byrow=T)
我們產生從每行一次取三個的4個項目的組合,並以列主要方式排列:
array( apply( X, 1, function(x) combn(x, 3) ), dim=c(3,4,3) )
, , 1
[,1] [,2] [,3] [,4]
[1,] 1 1 1 3
[2,] 3 3 1 1
[3,] 1 4 4 4
, , 2
[,1] [,2] [,3] [,4]
[1,] 2 2 2 5
[2,] 5 5 2 2
[3,] 2 1 1 1
, , 3
[,1] [,2] [,3] [,4]
[1,] 3 3 3 2
[2,] 2 2 5 5
[3,] 5 4 4 4
我找到了我問題的基本答案。 但是我認為它並沒有達到預期的速度。
例如,我有一個昏暗的(3 * 4)矩陣,為簡單起見,我假設我只有5個類型。 為了找到這種情況的頻率表,我編寫了以下代碼:
n <- 5
k <- dim(X)[1]
F <- matrix(0,n,n^3)
colnames(F) <- simplify2array(apply(expand.grid(1:n,1:n,1:n ), 1, paste, collapse =" ", sep = ""))
for(i in 1:k)
{
for(j in 1:4){
per <- simplify2array(permn(X[i,-j]))
pert_charac <- apply(per,2,paste,sep="",collapse=" ")
num <- sapply(pert_charac,f <- function(x) which(colnames(F)==x))
F[X[i,j],num] <- F[X[i,j],num]+1
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.