R: for-loop over matrix returns 只有最后一个值

R: for-loop over matrix returns only last values

所以我有一个充满随机数的矩阵:mat_base = matrix(sample(1:20, 100, replace = TRUE), nrow=10, ncol=10) 和另一个矩阵 mat_table = matrix(,100,3),它的列名是:colnames(mat_table) <- c("row", "col", "value").

我想将所有值及其位置(行号和列号)从 mat_base 放置到 mat_table 并且我已经成功地使用了这些位置。但是对于每个单元格的值 mat_table 只有 returns 来自 mat_base.

最后一列的值

这是我目前的代码:

for (j in 1:nrow(mat_base)) {
  for (k in 1:ncol(mat_base)){ 
    #2 nested for-loops to go through mat_base
    
    mat_table[,1] <- row(mat_base)
    #the function "row" returns a matrix of row numbers
    #put row numbers in the first column of mat_table
    
    mat_table[,2] <- col(mat_base)
    #the function "col" returns a matrix of column numbers
    #put column numbers in the second column of mat_table
    
    mat_table[,3] <- mat_base[,k]
    #get current value of mat_base and put it into mat_table
    #put values in the third column of mat_table

  }
  
}

mat_table
#show mat_table in the console

我知道我可能不需要带有 j 的外部 for 循环,因为没有它结果是一样的(反正我没有使用 j)但我不确定所以我暂时把它留了下来。

这是我使用这段代码得到的结果:

> mat_table
       row col value
  [1,]   1   1     4
  [2,]   2   1    11
  [3,]   3   1    13
  [4,]   4   1    13
  [5,]   5   1     2
  [6,]   6   1    17
  [7,]   7   1     7
  [8,]   8   1    14
  [9,]   9   1    19
 [10,]  10   1     3
 [11,]   1   2     4
 [12,]   2   2    11
 [13,]   3   2    13
 [14,]   4   2    13
 [15,]   5   2     2
 [16,]   6   2    17
 [17,]   7   2     7
 [18,]   8   2    14
 [19,]   9   2    19
 [20,]  10   2     3
 [21,]   1   3     4
 [22,]   2   3    11
 [23,]   3   3    13
...

正如您在 mat_table 的第三列中看到的,只有 mat_base 的最后一列被一遍又一遍地重复。如何将 mat_base 中的所有值转换为 mat_table

Edit/Answer: 好吧,我发现通过使用循环,我的生活变得比原来更艰难了...... 最后我是这样解决这个问题的:

mat_base = matrix(sample(1:20, 100, replace = TRUE), nrow=10, ncol=10) 
#my data

mat_table = matrix(,100,3)
#create an empty matrix with 100 rows and 3 columns
colnames(mat_table) <- c("row", "col", "value")
#change the column names 

mat_table <- cbind(c(row(mat_base)), c(col(mat_base)), c(mat_base))
#put row numbers, column numbers and values from mat_base into mat_table

mat_table
#show mat_table in console

编辑 2: 但是如果你想按照我最初尝试的方式去做,请查看@Mohanasundaram 的答案!

获得所需 table 的另一种方法是这样。

mat_base = matrix(sample(1:20, 100, replace = TRUE), nrow=10, ncol=10)

mat_table <- data.frame(row = rep(1:nrow(mat_base), by = ncol(mat_base)),
                        col = rep(1:ncol(mat_base), each = nrow(mat_base)),
                        value = c(mat_base))

对于您的原始方法,这是解决方案。您必须按行名和列名过滤矩阵,然后分配值。但是,这不是一个有效的方法。

mat_base = matrix(sample(1:20, 100, replace = TRUE), nrow=10, ncol=10)
mat_table = matrix(,100,3)
colnames(mat_table) <- c("row", "col", "value")

for (j in 1:nrow(mat_base)) {
  for (k in 1:ncol(mat_base)){ 
    #2 nested for-loops to go through mat_base
    
    mat_table[,1] <- row(mat_base)
    #the function "row" returns a matrix of row numbers
    #put row numbers in the first column of mat_table
    
    mat_table[,2] <- col(mat_base)
    #the function "col" returns a matrix of column numbers
    #put column numbers in the second column of mat_table
    
    mat_table[mat_table[,"row"] == j & mat_table[,"col"] == k,3] <- mat_base[j,k]
    #get current value of mat_base and put it into mat_table
    #put values in the third column of mat_table
    
  }
  
}