在这里,我有一个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)

#1楼 票数: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

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

#2楼 票数: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

  ask by Rami translate from so

未解决问题?本站智能推荐:

1回复

处理R中长度不相等的行的矩阵

我要划分两个矩阵: numer1和denom1 。 问题在于它们的行长不相等。 该脚本每周运行一次,因此尺寸也每周更改一次。 本星期: 上个星期: 有没有一种方法可以比较这些矩阵并删除较大矩阵中的最后一行(在本示例中为numer1 )? 这是我尝试过的:
2回复

用可能导致nan的numpy矩阵划分

当有时两个矩阵在同一个单元格中有0时,如何在python中划分两个numpy矩阵A和B ? 对于所有i , j A[i,j]>=B[i,j]基本上A[i,j]>=B[i,j] 。 我需要计算C=A/B 但有时A[i,j]==B[i,j]==0 。 当发生这种情况时,我需要
1回复

Matlab中矩阵行之间的除法

我在Matlab中执行矩阵行之间的除法时遇到一些问题; 即按元素划分两个后续行。 例如,我需要编写一个函数,将以下矩阵A转换为矩阵B : A = [1, 2, 3; 4, 5, 6; 7, 8, 9] B = [4, 2.5, 2; 1.75, 1.6, 1.5] 我怎样才
3回复

当分母中的元素可以为零时,有效的逐元素矩阵划分

我正在使用numpy使用Python 2.7.6进行编程。 我在两个numpy矩阵V/np.dot(W,H)之间进行了这种划分。 有时会发生分母的某些单元格值等于0,因此我得到运行时错误。 我想以有效的方式实施安全部门。 如何编写执行矩阵除法的代码,以及分母等于0的元素在输出矩阵中放置0
1回复

特征向量矩阵右划分问题

我正在尝试在c / ++中对向量/矩阵执行右除法,就像在matlab中使用/运算符一样。 更具体地说,我使用的是eigen,而我尝试进行除法的代码段如下: 行向量是3X1向量,normTransform是3X3矩阵。 我无法理解应该如何执行该操作。 任何提示我在做什么错?
1回复

矩阵除以另一个矩阵的行,在numpy中没有循环

不使用循环的情况下,等效的numpy代码实现是什么? 我需要做的是将“ a”的列除以“ b”的每一行。 最后,将有4个3 * 2大小的矩阵(“ a”的大小),其中每个矩阵都是“ a”除以“ b”行之一。 是否有可能在numpy中没有循环呢?
1回复

如何在MATLAB中将矩阵的行除以不同的值(数组除法)

可以说我有矩阵M = ones(3); 我想将每行除以不同的数字,例如C = [1;2;3]; 。 如何不使用循环就可以做到这一点?
2回复

用标量划分ndarray - Numpy / Python

我只是想知道如何在不使用循环的情况下做这样的事情。 我做了一个简单的测试试图调用一个分区,就像我们使用numpy.array一样,但我得到了相同的ndarray。 我想这应该很简单。 任何帮助,将不胜感激。