假设我们具有以下矩阵m
:
[1] "list of respective positions"
[,1] [,2] [,3] [,4] [,5]
x: 2.4131066 3.8504796 3.7434050 -1.923839 2.41310661
y: 0.0260981 0.7128027 0.7128027 1.396096 0.01565761
obj-val 0.7937068 0.3105951 0.4038012 1.195259 0.83750443
如何检索每一行的最小值和最大值?
(对于矩阵m
的每一行,我都需要一对(最小,最大)。
我不想使用软件包rowmins()
的{{1}}。
答案 0 :(得分:5)
您可以使用apply
:
my_mat <- matrix(rnorm(25), nrow = 5, dimnames = list(letters[1:5], NULL))
my_mat
#> [,1] [,2] [,3] [,4] [,5]
#> a -1.7455936 0.79571392 0.1509219 -0.61944619 -0.65429261
#> b 0.5858837 -0.32462380 1.3739094 -0.08092246 -1.24418958
#> c 1.0757723 -0.23296522 -2.2174416 0.56720160 -0.02991945
#> d 1.8043565 -0.00370110 -1.4628807 -0.73418720 0.10333882
#> e -0.4153639 -0.07896341 1.0089698 -0.09542518 0.17067607
t(apply(my_mat, 1, function(x) c(min = min(x), max = max(x))))
#> min max
#> a -1.7455936 0.7957139
#> b -1.2441896 1.3739094
#> c -2.2174416 1.0757723
#> d -1.4628807 1.8043565
#> e -0.4153639 1.0089698
由reprex package(v0.3.0)于2020-06-21创建
答案 1 :(得分:2)
使用艾伦·卡梅隆(Allan Cameron)的示例矩阵,您可以apply
range
函数
my_mat <- matrix(rnorm(25), nrow = 5, dimnames = list(letters[1:5], NULL))
my_mat
# [,1] [,2] [,3] [,4] [,5]
# a 1.7813097 -0.4946628 2.0344305 0.2620399 0.99000423
# b 1.0758692 0.4004411 -1.2957444 0.3443362 -0.71271404
# c 0.9705851 -0.1952594 -0.6168627 -0.3046352 -1.04132273
# d -0.5459703 -0.2538314 -1.6677170 -0.6585102 -0.06104492
# e -0.4463699 -0.3935345 0.6689235 0.5235429 0.40823566
apply(my_mat, 1, range)
# a b c d e
# [1,] -0.4946628 -1.295744 -1.0413227 -1.66771703 -0.4463699
# [2,] 2.0344305 1.075869 0.9705851 -0.06104492 0.6689235
答案 2 :(得分:1)
将pmin
转换为pmax
后,我们可以使用matrix
和data.frame
cbind(min = do.call(pmin, as.data.frame(my_mat)),
max = do.call(pmax, as.data.frame(my_mat)))
# min max
#[1,] -1.3169081 0.2660220
#[2,] -0.6051569 0.5982691
#[3,] -1.7096452 1.5362522
#[4,] -1.4290903 0.6099945
#[5,] -0.6485915 0.8474600
或使用rowMins/rowMaxs
中的matrixStats
library(matrixStats)
cbind(min = rowMins(my_mat), max = rowMaxs(my_mat))
# min max
#[1,] -1.3169081 0.2660220
#[2,] -0.6051569 0.5982691
#[3,] -1.7096452 1.5362522
#[4,] -1.4290903 0.6099945
#[5,] -0.6485915 0.8474600
或更紧凑的rowRanges
rowRanges(my_mat)
# [,1] [,2]
#[1,] -1.3169081 0.2660220
#[2,] -0.6051569 0.5982691
#[3,] -1.7096452 1.5362522
#[4,] -1.4290903 0.6099945
#[5,] -0.6485915 0.8474600
或使用transmute
library(dplyr)
as.data.frame(my_mat) %>%
transmute(min = pmin(!!! .), max = pmax(!!! .))
# min max
#1 -1.3169081 0.2660220
#2 -0.6051569 0.5982691
#3 -1.7096452 1.5362522
#4 -1.4290903 0.6099945
#5 -0.6485915 0.8474600
或与rowwise/c_across
library(tidyr)
as.data.frame(my_mat) %>%
rowwise %>%
summarise(out = list(as.list(range(c_across(everything()))))) %>%
unnest_wider(c(out), names_repair = ~ c('min', 'max'))
# A tibble: 5 x 2
# min max
# <dbl> <dbl>
#1 -1.32 0.266
#2 -0.605 0.598
#3 -1.71 1.54
#4 -1.43 0.610
#5 -0.649 0.847
set.seed(24)
my_mat1 <- matrix(rnorm(5 * 1e7), nrow = 1e7)
system.time(cbind(min = do.call(pmin, as.data.frame(my_mat1)),
max = do.call(pmax, as.data.frame(my_mat1))))
# user system elapsed
# 0.804 0.209 1.009
system.time(rowRanges(my_mat1))
# user system elapsed
# 0.303 0.000 0.303
system.time(apply(my_mat1, 1, range))
# user system elapsed
# 30.373 0.455 31.037
system.time(t(apply(my_mat1, 1, function(x) c(min = min(x), max = max(x)))))
# user system elapsed
# 34.594 0.728 35.240
set.seed(24)
my_mat <- matrix(rnorm(25), nrow = 5, dimnames = list(letters[1:5], NULL))
答案 3 :(得分:0)
[1] "list of respective positions"
[,1] [,2] [,3] [,4] [,5]
x: 3.69250663 3.75443457 4.4075606 3.7544346 4.16053631
y: 0.61196240 0.61196240 0.6899600 0.6899600 0.68996003
obj-val 0.05702941 0.08390476 0.1334916 0.2036376 0.07759858
MIN_t=apply(D, 1, min)
MAX_t=apply(D, 1, max)
New_domain_search=cbind(MIN_t,MAX_t)
输出:
MIN_t MAX_t
x: 3.69250663 4.4075606
y: 0.61196240 0.6899600
obj-val 0.05702941 0.2036376