从2矩阵R中查找每行的最小值

从2矩阵R中查找每行的最小值,r,matrix,R,Matrix,我需要2矩阵中每行的最小值。行名称在两个矩阵中都是通用的,但列名会更改 例如: 我试过了 t(apply(Y, 1, sort)[ 1, ]) t(apply(X, 1, sort)[ 1, ]) 然而,我不知道如何从矩阵和表格中分别找到最小值作为预期的输出文件。此外,我还复制了行名和列名。这里有一个tidyverse的可能性。注意,我使用了固定种子set.seed(2017)来生成样本数据 library(tidyverse) cbind.data.frame(X, Y) %>%

我需要2矩阵中每行的最小值。行名称在两个矩阵中都是通用的,但列名会更改

例如:

我试过了

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)
来生成样本数据

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

您可以将矩阵与
cbind
组合,并将其与
t()
转置。然后,
dplyr
中的
summary\u all
可以为每一行提供一分钟

library(dplyr)
as.data.frame(t(cbind(X,Y))) %>% summarise_all(funs(min))
#        Inst1       Inst2       Inst3      Inst4
# 1 0.05845904 0.006901952 0.009513836 0.05197972

您可以将矩阵与
cbind
组合,并将其与
t()
转置。然后,
dplyr
中的
summary\u all
可以为每一行提供一分钟

library(dplyr)
as.data.frame(t(cbind(X,Y))) %>% summarise_all(funs(min))
#        Inst1       Inst2       Inst3      Inst4
# 1 0.05845904 0.006901952 0.009513836 0.05197972

使用@Maurits的样本数据,以R为基数:

XY <- cbind(X,Y)
wm_     <- apply(XY,1,which.min)
Minimum <- apply(XY,1,min)
data.frame(Minimum, id = colnames(XY)[wm_])
#           Minimum   id
# Inst1 0.025093514 Ref4
# Inst2 0.110404957 Alt5
# Inst3 0.039322336 Ref2
# Inst4 0.002020766 Ref3

XY使用@Maurits的样本数据,以R为基数:

XY <- cbind(X,Y)
wm_     <- apply(XY,1,which.min)
Minimum <- apply(XY,1,min)
data.frame(Minimum, id = colnames(XY)[wm_])
#           Minimum   id
# Inst1 0.025093514 Ref4
# Inst2 0.110404957 Alt5
# Inst3 0.039322336 Ref2
# Inst4 0.002020766 Ref3


XY在使用基于随机数的样本数据时,请始终使用固定种子(例如
set.seed(1234)
),以确保预期输出的再现性。否则无法重现预期输出。请始终使用固定种子(例如,
set.seed(1234)
),以确保使用基于随机数的样本数据时预期输出的再现性。否则就无法重现您的预期输出。嗨,毛里塔尼亚,谢谢!我复制了行名和列名,但我不想创建唯一的列表。如何保持重复的行名和列名,并仍然实现此输出?@amarPar我不知道你的意思。请更新您的帖子,以包含更具代表性的样本数据集和预期输出(请记住使用固定种子)。您也可以使用
top\n(-1,“Minimum”)
而不是
过滤器call@Moody_Mudskipper那很好;我从未意识到
top\n
可以接受第三个参数。感谢您的帮助:-)您好,是否可以保留第一、第二和第三个最小值的结果。如果两个或多个不同的ID获得相同的值并满足第一、第二或第三个最小标准,我更愿意保留所有ID。谢谢。嗨,毛里塔尼亚,谢谢!我复制了行名和列名,但我不想创建唯一的列表。如何保持重复的行名和列名,并仍然实现此输出?@amarPar我不知道你的意思。请更新您的帖子,以包含更具代表性的样本数据集和预期输出(请记住使用固定种子)。您也可以使用
top\n(-1,“Minimum”)
而不是
过滤器call@Moody_Mudskipper那很好;我从未意识到
top\n
可以接受第三个参数。感谢您的帮助:-)您好,是否可以保留第一、第二和第三个最小值的结果。如果两个或多个不同的ID获得相同的值并满足第一、第二或第三个最小标准,我更愿意保留所有ID。谢谢。嗨,穆迪,谢谢,我得到了错误,data.frame(Minimum,id=colnames(XY)[wm_])数据中的错误。frame(Minimum,id=colnames(XY)[wm_]):参数意味着不同的行数:10,4。使用的是真实数据,而不是样本中的数据,对吗?这真的很奇怪,这些函数非常简单稳定,在我这方面工作得很好,请仔细检查您是否从@Maurits'帖子中复制了它,并且没有覆盖
Minimum
wm\u
,如果仍然失败,请告诉我
length(Minimum)
length(colnames(XY)[wm_41;是的,我是从Maurit'的帖子中复制的。>length(Minimum)[1]40>length(colnames(XY)[wm_])[1]4Hi Moody,谢谢,我得到了错误,data.frame(Minimum,id=colnames(XY)[wm_])数据中的错误。frame(Minimum,id=colnames(XY)[wm uu]):参数意味着不同的行数:10,4。使用真实数据,而不是样本中的数据,对吗?这真是奇怪,这些都是非常简单和稳定的函数,它在我这方面工作得很好,请仔细检查您是否从@Maurits的帖子中复制了它,并且没有覆盖
Minimum
wm_
,如果仍然失败,请告诉我
length(Minimum)
length(colnames(XY)[wm uz])
是,我是从毛里特的帖子上抄的。>长度(最小值)[1]40>长度(colnames(XY)[wm_])[1]4
XY <- cbind(X,Y)
wm_     <- apply(XY,1,which.min)
Minimum <- apply(XY,1,min)
data.frame(Minimum, id = colnames(XY)[wm_])
#           Minimum   id
# Inst1 0.025093514 Ref4
# Inst2 0.110404957 Alt5
# Inst3 0.039322336 Ref2
# Inst4 0.002020766 Ref3