我有一个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”)
答案 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
}
}