请帮我解决以下问题。
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 r1
和rows
中column 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}}的差异越来越大的排序。任何帮助/线索都会受到赞赏。
答案 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)
假设c3
和c4
是第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