r-创建一个双变量频率矩阵

r-创建一个双变量频率矩阵,r,matrix,frequency,R,Matrix,Frequency,假设我有一个矩阵,其中行表示单个样本。我正在采样而不进行替换,这样行就不会包含重复的条目 samp_frame <- 1:6 samp <- matrix(c(1,2,3,3,4,1,5,1,6),nrow=3,ncol=3) samp [,1] [,2] [,3] [1,] 1 3 5 [2,] 2 4 1 [3,] 3 1 6 我写了一个函数来实现这一点,但它可能不是很有效。因此,我正在寻找如何改进它的建议 pa

假设我有一个矩阵,其中行表示单个样本。我正在采样而不进行替换,这样行就不会包含重复的条目

samp_frame <- 1:6
samp <- matrix(c(1,2,3,3,4,1,5,1,6),nrow=3,ncol=3)
samp

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    1
[3,]    3    1    6
我写了一个函数来实现这一点,但它可能不是很有效。因此,我正在寻找如何改进它的建议

pair_freq <- function(samp_frame,samp){

   N <- length(samp_frame)
   output <- matrix(0,nrow=N,ncol=N)

   # Fill in diagonal entries
   temp <- table(samp)
   freq <- data.frame(id=as.numeric(rownames(temp)), 
                      count=data.frame(temp)[,2])
   for (i in 1:N){
      output[i,i] <- freq[i,"count"]
   }

   # Fill in off-diagonal entries
   for(i in 1:nrow(samp)){
      current <- unique(samp[i,])
      for (j in 1:(N-1)){
         m <- j+1
         for (k in m:N){
            output[j,k] <- output[j,k] + all(c(j,k) %in% current)
            output[k,j] <- output[j,k]
         }
      }
   }
   output
}
这里有一个方法:

is.present <- function(j)apply(samp,1,function(row)as.integer(any(row==j)))
m <- sapply(min(samp):max(samp),is.present)
t(m) %*% m
#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    3    1    2    1    1    1
# [2,]    1    1    0    1    0    0
# [3,]    2    0    2    0    1    1
# [4,]    1    1    0    1    0    0
# [5,]    1    0    1    0    1    0
# [6,]    1    0    1    0    0    1
创建一个n×k矩阵
m
,该矩阵在samp中每行有一行,每个可能结果有一列,如果数字
j
存在于samp的行
i
中,则
m[i,j]=1
。那么

mT×m


生成一个k×k矩阵,其中元素
[i,j]
samp
中的数或行,其中
i
j
一起出现。

实矩阵包含多少列?你能解释一下如何处理同一行上的重复数字吗?例如,一行
c(1,1,1,2,2)
out[1,1],out[1,2],out[2,2]
的贡献是什么?@flodel这是一个很好的观点。我正在采样,没有替换,所以在同一行中不会有任何重复的元素。目前,我的真实数据矩阵最多有20列(每个样本/行有20个值)。我可能还应该提到,我正在从1到25对数字进行抽样。这是一个非常聪明的方法!谢谢你提供了一个非常清楚的解释。
X1 X2 freq
 1  1    3
 1  2    1
 1  3    2
 1  4    1
 1  5    1
 1  6    1
 2  2    1
 2  3    1
...
is.present <- function(j)apply(samp,1,function(row)as.integer(any(row==j)))
m <- sapply(min(samp):max(samp),is.present)
t(m) %*% m
#      [,1] [,2] [,3] [,4] [,5] [,6]
# [1,]    3    1    2    1    1    1
# [2,]    1    1    0    1    0    0
# [3,]    2    0    2    0    1    1
# [4,]    1    1    0    1    0    0
# [5,]    1    0    1    0    1    0
# [6,]    1    0    1    0    0    1
m <- sapply(min(samp):max(samp),is.present)