我需要 2 个矩阵中每一行的最小值。行名称在两个矩阵中都是通用的,但列名称会发生变化。
例如:
matrix 1:
X <- matrix(runif(20), nrow=4)
rownames(X) <- paste0("Inst", seq(nrow(X)))
colnames(X) <- paste0("Ref", seq(ncol(X)))
matrix 2:
Y <- matrix(runif(20), nrow=4)
rownames(Y) <- paste0("Inst", seq(nrow(X)))
colnames(Y) <- paste0("Alt", seq(ncol(X)))
预期结果:
Minimum Id
Inst1 0.1275317 Ref15
Inst2 0.0006247 Alt4
Inst3 0.04583117 Ref13
Inst4 0.1111354 Alt5
我试过了
t(apply(Y, 1, sort)[ 1, ])
t(apply(X, 1, sort)[ 1, ])
但不知道如何从矩阵中找到最小值并分别制表作为预期的输出文件。我也有重复的行名和列名。
这是一种tidyverse
可能性。请注意,我使用了固定种子set.seed(2017)
来生成样本数据。
library(tidyverse)
cbind.data.frame(X, Y) %>%
rownames_to_column("row") %>%
gather(Id, Minimum, -row) %>%
group_by(row) %>%
filter(Minimum == min(Minimum)) %>%
arrange(row)
## A tibble: 4 x 3
## Groups: row [4]
# row Id Minimum
# <chr> <chr> <dbl>
#1 Inst1 Ref4 0.0251
#2 Inst2 Alt5 0.110
#3 Inst3 Ref2 0.0393
#4 Inst4 Ref3 0.00202
set.seed(2017)
X <- matrix(runif(20), nrow=4)
rownames(X) <- paste0("Inst", seq(nrow(X)))
colnames(X) <- paste0("Ref", seq(ncol(X)))
Y <- matrix(runif(20), nrow=4)
rownames(Y) <- paste0("Inst", seq(nrow(Y)))
colnames(Y) <- paste0("Alt", seq(ncol(Y)))
为了回应您的评论,保留您可以使用的前 3 个最低条目top_n
(如@Moody_Mudskipper 所建议)
cbind.data.frame(X, Y) %>%
rownames_to_column("row") %>%
gather(Id, Minimum, -row) %>%
group_by(row) %>%
top_n(-3, Minimum) %>%
arrange(row, Minimum)
## A tibble: 12 x 3
## Groups: row [4]
# row Id Minimum
# <chr> <chr> <dbl>
# 1 Inst1 Ref4 0.0251
# 2 Inst1 Alt3 0.0763
# 3 Inst1 Alt5 0.129
# 4 Inst2 Alt5 0.110
# 5 Inst2 Alt4 0.212
# 6 Inst2 Alt3 0.261
# 7 Inst3 Ref2 0.0393
# 8 Inst3 Alt5 0.177
# 9 Inst3 Ref1 0.469
#10 Inst4 Ref3 0.00202
#11 Inst4 Alt3 0.0175
#12 Inst4 Ref1 0.289
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句