计算矩阵中每行的唯一对的划分

时间:2017-08-16 00:23:52

标签: r matrix division

这里我有一个5 * 4矩阵(原来大得多)。我想计算矩阵每行中每个唯一对的比率。

X1  X2  X3  X4
10  8   2   1
4   4   3   6
2   10  8   1
1   2   1   10
3   5   5   4

我想实现一个具有非重复分割的5 * 6矩阵,如下面的>

x1/x2   x1/x3   x1/x4   x2/x3   x2x4    x3/x4
1.25    5.00    10.00   4.00    8.00    2.00
1.00    1.33    0.67    1.33    0.67    0.50
0.20    0.25    2.00    1.25    10.00   8.00
0.50    1.00    0.10    2.00    0.20    0.10
0.60    0.60    0.75    1.00    1.25    1.25

现在我已经创建了一个我希望可以解决问题的功能,但结果并不像预期的那样。

set.seed(7)
test <- data.frame(replicate(4,sample(1:10,5,rep=TRUE)))

func_calcRatio <- function(theMatrix){

  ratios <- outer(theMatrix, theMatrix, '/')
  ratios <- ratios[upper.tri(ratios)]
  return(ratios)
}


func_ratioMatrix <- function(theMatrix){

  ratios_list <- list()
  i = 1
  l = length(theMatrix)
  for (i in 1:l) {
    vec <- numeric(l)
    for (j in 1:l){
      vec[j] <- i^j
    }
    myrow <- theMatrix[,1]
    onerow <- func_calcRatio(myrow)
    ratios_list[[i]] <- onerow
    i = i+1
  }

  ratios_df <- do.call("rbind", ratios_list)
  return(ratios_df)
}

test.ratios <-  func_ratioMatrix(test)

2 个答案:

答案 0 :(得分:3)

让上面的矩阵为A。然后你可以使用下面的代码:

    combn(4,2,function(x) A[,x[1]]/A[,x[2]])
       [,1]     [,2]       [,3]     [,4]       [,5] [,6]
  [1,] 1.25 5.000000 10.0000000 4.000000  8.0000000 2.00
  [2,] 1.00 1.333333  0.6666667 1.333333  0.6666667 0.50
  [3,] 0.20 0.250000  2.0000000 1.250000 10.0000000 8.00
  [4,] 0.50 1.000000  0.1000000 2.000000  0.2000000 0.10
  [5,] 0.60 0.600000  0.7500000 1.000000  1.2500000 1.25

如果数据在数据框而不是矩阵中,那么您可以使用数组操作:

例如。让我们假设上面的矩阵为A=as.data.frame(A)然后

  combn(A,2,function(x)x[,1,]/x[,2,])
      [,1]     [,2]       [,3]     [,4]       [,5] [,6]
[1,] 1.25 5.000000 10.0000000 4.000000  8.0000000 2.00
[2,] 1.00 1.333333  0.6666667 1.333333  0.6666667 0.50
[3,] 0.20 0.250000  2.0000000 1.250000 10.0000000 8.00
[4,] 0.50 1.000000  0.1000000 2.000000  0.2000000 0.10
[5,] 0.60 0.600000  0.7500000 1.000000  1.2500000 1.25

您仍然可以按照自己的方式修改代码。这只是一个粗略的想法。希望它有所帮助

答案 1 :(得分:1)

dat <- structure(list(X1 = c(10L, 4L, 2L, 1L, 3L), X2 = c(8L, 4L, 10L, 
2L, 5L), X3 = c(2L, 3L, 8L, 1L, 5L), X4 = c(1L, 6L, 1L, 10L, 
4L)), .Names = c("X1", "X2", "X3", "X4"), class = "data.frame", row.names = c(NA, 
-5L))

在逐行使用apply时,需要将结果转置为按行获取值:

t( # this is the last function to execute, we will need to convert to row basis
  apply(dat, 1, # loop over rows, single row at a time
   function( r){ apply( combn(r,2), 2,  # now loop over columns of `combn` result
                                   function(x) x[[1]]/x[[2]]) }))
     [,1]     [,2]       [,3]     [,4]       [,5] [,6]
[1,] 1.25 5.000000 10.0000000 4.000000  8.0000000 2.00
[2,] 1.00 1.333333  0.6666667 1.333333  0.6666667 0.50
[3,] 0.20 0.250000  2.0000000 1.250000 10.0000000 8.00
[4,] 0.50 1.000000  0.1000000 2.000000  0.2000000 0.10
[5,] 0.60 0.600000  0.7500000 1.000000  1.2500000 1.25