在 pmin 中使用 na.rm=T 和 do.call
Using na.rm=T in pmin with do.call
我想提取存储在列表中的几个矩阵的每个元素的最小值。我正在使用 pmin:
do.call(pmin, mylist)
问题是这些矩阵的某些元素是 NA,而 pmin 产生一个 NA,我希望它在排除 NA 后产生最小值。我尝试使用来解决我的问题
do.call(pmin(na.rm=T), mylist)
但是我得到一个错误。我也尝试过这个答案:,但我得到了错误,因为 .SD 不在环境中。
类似问题的简单代码是:
mymat1 <- matrix(rnorm(10), ncol=2)
mymat2 <- matrix(rnorm(10), ncol=2)
mymat2[2,2] <- NA
mymat3 <- matrix(rnorm(10), ncol=2)
mylist <- list(mymat1, mymat2, mymat3)
do.call(pmin, mylist)
我在结果矩阵的 [2,2] 位置得到一个 NA,我想得到忽略 NA 的最小值。
有什么建议么?
谢谢。
将 na.rm = TRUE
连接为命名的 list
元素,然后将 pmin
与 do.call
一起使用,以便找到参数 na.rm
do.call(pmin, c(mylist, list(na.rm = TRUE)))
# [,1] [,2]
#[1,] -1.0830716 -0.1237099
#[2,] -0.5949517 -3.7873790
#[3,] -2.1003236 -1.2565663
#[4,] -0.4500171 -1.0588205
#[5,] -1.0937602 -1.0537657
如果你使用 purrr
/ tidyverse
你可以使用 purrr::invoke
。
library(purrr)
invoke(pmin,mylist,na.rm=TRUE)
# [,1] [,2]
# [1,] -0.3053884 -1.3770596
# [2,] 0.9189774 -0.4149946
# [3,] -0.1027877 -0.3942900
# [4,] -0.6212406 -1.4707524
# [5,] -2.2146999 -0.4781501
它基本上是带有 ...
参数的 do.call
,它的源代码或多或少是@akrun 的回答:
function (.f, .x = NULL, ..., .env = NULL)
{
.env <- .env %||% parent.frame()
args <- c(as.list(.x), list(...))
do.call(.f, args, envir = .env)
}
purrr::partial
也很有趣:
pmin2 <- partial(pmin,na.rm=TRUE)
do.call(pmin2,mylist)
# [,1] [,2]
# [1,] -0.3053884 -1.3770596
# [2,] 0.9189774 -0.4149946
# [3,] -0.1027877 -0.3942900
# [4,] -0.6212406 -1.4707524
# [5,] -2.2146999 -0.4781501
我想提取存储在列表中的几个矩阵的每个元素的最小值。我正在使用 pmin:
do.call(pmin, mylist)
问题是这些矩阵的某些元素是 NA,而 pmin 产生一个 NA,我希望它在排除 NA 后产生最小值。我尝试使用来解决我的问题 do.call(pmin(na.rm=T), mylist)
但是我得到一个错误。我也尝试过这个答案:
mymat1 <- matrix(rnorm(10), ncol=2)
mymat2 <- matrix(rnorm(10), ncol=2)
mymat2[2,2] <- NA
mymat3 <- matrix(rnorm(10), ncol=2)
mylist <- list(mymat1, mymat2, mymat3)
do.call(pmin, mylist)
我在结果矩阵的 [2,2] 位置得到一个 NA,我想得到忽略 NA 的最小值。 有什么建议么? 谢谢。
将 na.rm = TRUE
连接为命名的 list
元素,然后将 pmin
与 do.call
一起使用,以便找到参数 na.rm
do.call(pmin, c(mylist, list(na.rm = TRUE)))
# [,1] [,2]
#[1,] -1.0830716 -0.1237099
#[2,] -0.5949517 -3.7873790
#[3,] -2.1003236 -1.2565663
#[4,] -0.4500171 -1.0588205
#[5,] -1.0937602 -1.0537657
如果你使用 purrr
/ tidyverse
你可以使用 purrr::invoke
。
library(purrr)
invoke(pmin,mylist,na.rm=TRUE)
# [,1] [,2]
# [1,] -0.3053884 -1.3770596
# [2,] 0.9189774 -0.4149946
# [3,] -0.1027877 -0.3942900
# [4,] -0.6212406 -1.4707524
# [5,] -2.2146999 -0.4781501
它基本上是带有 ...
参数的 do.call
,它的源代码或多或少是@akrun 的回答:
function (.f, .x = NULL, ..., .env = NULL)
{
.env <- .env %||% parent.frame()
args <- c(as.list(.x), list(...))
do.call(.f, args, envir = .env)
}
purrr::partial
也很有趣:
pmin2 <- partial(pmin,na.rm=TRUE)
do.call(pmin2,mylist)
# [,1] [,2]
# [1,] -0.3053884 -1.3770596
# [2,] 0.9189774 -0.4149946
# [3,] -0.1027877 -0.3942900
# [4,] -0.6212406 -1.4707524
# [5,] -2.2146999 -0.4781501