使用do.call在pmin中使用na.rm = T.

时间:2018-06-06 22:10:36

标签: r do.call

我想提取存储在列表中的几个矩阵的每个元素的最小值。我正在使用pmin:

do.call(pmin, mylist)

问题是这些矩阵的某些元素是NA,而pmin产生NA,我希望它在排除NA后产生最小值。我试图解决我的问题     do.call(pmin(na.rm = T),mylist)

但是我收到了错误。我也尝试了这个答案:data.table and pmin with na.rm=TRUE argument,但我得到了错误,因为.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的最小值。 有什么建议? 谢谢。

2 个答案:

答案 0 :(得分:3)

na.rm = TRUE连接为已命名的list元素,然后将pmindo.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

答案 1 :(得分:2)

如果您使用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