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