从R中的4 dim矩阵创建频率矩阵

时间:2012-10-09 17:14:54

标签: 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的频率表,记录与其余三个节点接触的每个节点的频率。另一方面,我想知道四元组中的每个节点都与哪种类型的节点接触。

例如,对于第一行,我有一个1,(1,3,4)的F,也有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”)

2 个答案:

答案 0 :(得分:0)

我不确定我理解,如果我这样做,那么你没有正确地做到这一点,因为你没有正确地订购你的三胞胎,所以这是猜测。我认为向量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) 

我们从每一行中一次生成三个项目的组合,并以列主要方式排列:

 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

答案 1 :(得分:0)

我找到了问题的基本答案。但我认为它并不快,应该如此。

例如我有一个昏暗的矩阵(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
    }
 }