【问题标题】:Using na.rm=T in pmin with do.call在 pmin 中使用 na.rm=T 和 do.call
【发布时间】:2018-06-06 22:10:35
【问题描述】:

我想提取存储在列表中的几个矩阵的每个元素的最小值。我正在使用 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 的最小值。 有什么建议么? 谢谢。

【问题讨论】:

    标签: r do.call


    【解决方案1】:

    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
    

    【讨论】:

    • 因为 mylist 已经是一个列表,所以不需要 list(na.rm=TRUE) 只需 c(mylist, na.rm = TRUE) 就可以了
    • 这正是我所需要的。干杯。
    【解决方案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
    

    【讨论】:

    • 太棒了!非常简单。谢谢。
    猜你喜欢
    • 2016-06-17
    • 1970-01-01
    • 2018-04-17
    • 2014-04-12
    • 2018-01-03
    • 1970-01-01
    • 2021-08-04
    • 2019-12-14
    • 1970-01-01
    相关资源
    最近更新 更多