0

我有一个 k*4 维度的矩阵,每一行是(1:20,1:20,1:20,1:20)quadruplet node 的组合和指定类型之一。例如,对于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)th 以及 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 个 1 添加到它的第 4 行中的频率矩阵中,并且它的 2,3 或 4 可能相同。例如因为一个在第一行重复,添加两条记录到 F[1,which(colnames(F)=="1 3 4")

4

2 回答 2

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) 

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

 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
于 2012-10-09T22:56:52.283 回答
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
    }
 }
于 2012-10-10T13:52:27.663 回答