Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将频率矩阵转换为R中的有序对列表_R_Matrix - Fatal编程技术网

将频率矩阵转换为R中的有序对列表

将频率矩阵转换为R中的有序对列表,r,matrix,R,Matrix,假设我有一个3x3的频率值矩阵。该矩阵中的每个单元格表示在某个位置检测到的实体数(这些位置的细节对我们的目的并不重要)。例如,在第1行第1列中检测到0个实体;第2行第3列检测到3个实体;等等 [,1] [,2] [,3] [1,] 0 1 0 [2,] 1 2 3 [3,] 0 1 1 我想将此矩阵转换为nx2数据帧,其中n是在所有位置检测到的实体总数。在这种情况下,应该有9行,因为总共检测到9个实体。在我们创建的数据框架中,第1

假设我有一个3x3的频率值矩阵。该矩阵中的每个单元格表示在某个位置检测到的实体数(这些位置的细节对我们的目的并不重要)。例如,在第1行第1列中检测到0个实体;第2行第3列检测到3个实体;等等

     [,1] [,2] [,3]
[1,]    0    1    0
[2,]    1    2    3
[3,]    0    1    1
我想将此矩阵转换为nx2数据帧,其中n是在所有位置检测到的实体总数。在这种情况下,应该有9行,因为总共检测到9个实体。在我们创建的数据框架中,第1列应该包含实体的行索引,第2列应该包含实体的列索引

我们可以使用下面的代码来实现这一点,但是对于较大的矩阵,这种方法非常慢

mat <- matrix(c(0,1,0,1,2,3,0,1,1), nrow = 3, byrow = TRUE)
x <- rep(NA, 9)
y <- rep(NA, 9)
count <- 0
for(i in 1:3){
    for(j in 1:3){
        while(mat[i,j] > 0){
            count <- count + 1
            x[count] <- i
            y[count] <- j
            mat[i,j] <- mat[i,j] - 1
        }
    }
}
df <- data.frame(x, y)
我们解释此数据帧的方式是,在位置(1,2)检测到一个实体,在位置(2,1)检测到一个实体,在位置(2,2)检测到两个实体,依此类推。这个输出是正确的,但我更愿意使用更快的方法来获得它


有更好的方法吗?

arr.ind参数提供起始点,即具有非零项的索引,并且您可以通过输入值吃掉它们:

idxs <- which(dat > 0, arr.ind=TRUE)
idxs[ rep(1:nrow(idxs), dat[dat>0]), ]
      row col
 [1,]   2   1
 [2,]   1   2
 [3,]   2   2
 [4,]   2   2
 [5,]   3   2
 [6,]   2   3
 [7,]   2   3
 [8,]   2   3
 [9,]   3   3
idxs 0,arr.ind=TRUE)
idxs[rep(1:nrow(idxs),dat[dat>0]),]
行列
[1,]   2   1
[2,]   1   2
[3,]   2   2
[4,]   2   2
[5,]   3   2
[6,]   2   3
[7,]   2   3
[8,]   2   3
[9,]   3   3
idxs <- which(dat > 0, arr.ind=TRUE)
idxs[ rep(1:nrow(idxs), dat[dat>0]), ]
      row col
 [1,]   2   1
 [2,]   1   2
 [3,]   2   2
 [4,]   2   2
 [5,]   3   2
 [6,]   2   3
 [7,]   2   3
 [8,]   2   3
 [9,]   3   3