找到根据矩阵中特定列中行之间的绝对差异排序的子集

时间:2013-12-25 11:25:55

标签: r sorting matrix subset minimum

请帮我解决以下问题。

set.seed(5)
matrix <- matrix(round(rnorm(100,100,50)), nrow = 4, ncol = 2, byrow = TRUE,
             dimnames = list(c("r1", "r2", "r3","r4"),c("c1","c2")))

我需要上面矩阵的子集/行,absolute difference row r1rowscolumn c1的其余部分。如果sort按行difference递增,那么行也会有用minimum。从那里我可以找到具有 c1 c2 r1 10 4 r2 6 11 r3 9 17 r4 21 91 差异值的行。

输入矩阵

   c1   c2
r1 10   4
r2 9    17
r3 6    11
r4 21   91

输出矩阵

row r1

row r2 to r3仍然是参考。 row r1根据与column c1中{{1}}的差异越来越大的排序。任何帮助/线索都会受到赞赏。

2 个答案:

答案 0 :(得分:3)

首先,您可以使用以下命令计算第1行与所有行(关于第3列和第4列)之间的绝对差值:

differences <- abs(t(t(matrix[ , 3:4]) - matrix[1, 3:4])) 

#     c3 c4
# r1   0  0
# r2  39 36
# r3 124 44
# r4   9 11
# r5  75 17

现在,您可以按照第一列中的第一列(c3)和第二列中的第2列(c4)排序这些差异。此订单用于订购原始matrix

matrix[order(differences[ , 1], differences[ , 2]), ]

#     c1  c2  c3  c4
# r1  58 169  37 104
# r4  46  92  46  93
# r2 186  70  76  68
# r5  70  -9 112  87
# r3  86 107 161  60

根据相关新示例进行更新:

differences <- abs(t(t(matrix[ , ]) - matrix[1, ])) 

#    c1 c2
# r1  0  0
# r2  4  7
# r3  1 13
# r4 11 87

matrix[order(differences[ , 1], differences[ , 2]), ]

#    c1 c2
# r1 10  4
# r3  9 17
# r2  6 11
# r4 21 91

答案 1 :(得分:0)

假设c3c4是第3列和第4列,请使用apply计算第1行与其他行之间的绝对差值之和。在apply调用的函数中,r是每行的向量:

> apply(matrix,1,function(r){sum(abs(r[3:4]-matrix[1,3:4]))})
 r1  r2  r3  r4  r5 
  0  75 168  20  92 

第一个是零,这很好,因为这是第1行与其自身的绝对差值之和。所以继续:

> diffs = apply(matrix,1,function(r){sum(abs(r[3:4]-matrix[1,3:4]))})
> diffs
 r1  r2  r3  r4  r5 
  0  75 168  20  92 

要找到最小的索引,忽略零,取下第一个元素,找到第一个最小的元素(如果有关系,这将只取一个......)并添加一个:

> 1+which(diffs[-1]==min(diffs[-1]))[1]
r4 
 4 

通过增加和abs diff来重新排序矩阵:

> order(diffs)
[1] 1 4 2 5 3
> matrix[order(diffs),]
    c1  c2  c3  c4
r1  58 169  37 104
r4  46  92  46  93
r2 186  70  76  68
r5  70  -9 112  87
r3  86 107 161  60