Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 查找根据矩阵中特定列中的行之间的绝对差异排序的子集_R_Sorting_Matrix_Subset_Minimum - Fatal编程技术网

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

R 查找根据矩阵中特定列中的行之间的绝对差异排序的子集,r,sorting,matrix,subset,minimum,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"))) 输出矩阵 c1 c2 r1 10 4 r2 9 17 r3 6 11 r4 21 91 第r1行保留为参考第r2行到第r3行

请帮我输入以下代码

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")))
输出矩阵

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

第r1行
保留为参考<代码>第r2行到第r3行根据与第c1列中的第r1行的差异的增加进行排序。欢迎提供任何帮助/线索

假设
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差异对矩阵进行重新排序,请执行以下操作:

> 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

首先,可以使用以下命令计算第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

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

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

差异您是指绝对差异的总和吗?ie的
j
最小化
sum(abs(矩阵[1,3:4]-matrix[j,3:4])
?@Spacedman可能无法正确提出我的查询。我想先在
列c3中找到行r1和其他行之间的
最低abs差值
,然后根据列c4中增加的abs差值排序
。我认为在多个列中的一行中
min abs diff
可能并不总是可行的。我希望这次我能澄清我的疑问。也许我刚刚发布的答案太多了。编辑你的Q以显示你的矩阵,并显示和解释你想要的结果(在这个例子中,你可以手工计算出来)你摇滚。我得到了线索。:)
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