【问题标题】:Is there an R function for applying min() on all values of a whole column?是否有用于将 min() 应用于整列的所有值的 R 函数?
【发布时间】:2021-10-20 11:36:02
【问题描述】:

我不是说要找到列的最小值。我的意思是将列中的每个值与一个数字进行比较并提取最小值进行比较,最好作为一个新列?我必须使用循环、rapply/lapply,还是可以用矢量化做一些事情?下面的例子。

输入:

Column
1
2
3

用于比较的最小值:2

输出:

Column
1
2
2

【问题讨论】:

  • 我不完全确定您要做什么,但pmax(Column, 2) 将从上面的第一帧中获得第二个。 (相关函数:pmin,以及稍微相关的cummincummax。)
  • 它似乎正在工作,但是当我尝试将它分配给 shinyapp renderTable 函数中的新列时,它说错误替换有 0 行。无论如何,非常感谢您帮助我发现了 pmin 功能!绝对为我节省了很多编写循环的时间...
  • 我不知道你在这两个框架之外做什么以及我建议的表达方式。
  • 我试图这样做:table$min_hdg_lim_L
  • 检查对象和列名的拼写。例如,如果hdg_lim_L 不是data.frame 中名为table 的列,那么它将返回NULL,而pmin(NULL,2) 返回numeric(0),它不能分配给具有超过0 行。

标签: r loops vectorization apply


【解决方案1】:

如果我理解正确,有几种方法可以做到这一点。这是一种非常有效的dplyrish 方式,但我认为不一定是最性感的:

library(tidyverse)

input <- tibble(
    x = 1:3
)

mins_to_compare_across <- c(1,2,2)

input %>%
    mutate(mins_to_compare_across = mins_to_compare_across) %>%
    rowwise() %>%
    transmute(
        x = min(
            c_across(
                c(
                    x,
                    mins_to_compare_across
                )
            )
        )
    ) %>%
    ungroup()
#> # A tibble: 3 × 1
#>       x
#>   <dbl>
#> 1     1
#> 2     2
#> 3     2

reprex package (v2.0.1) 于 2021-08-18 创建

这是我非常喜欢的purrr 方式:

library(tidyverse)

input <- tibble(
    x = 1:3
)

mins_to_compare_across <- c(1,2,2)

input %>%
    mutate(
        x = map2_dbl(
            x,
            mins_to_compare_across,
            ~ min(.x, .y)
        )
    )
#> # A tibble: 3 × 1
#>       x
#>   <dbl>
#> 1     1
#> 2     2
#> 3     2

reprex package (v2.0.1) 于 2021-08-18 创建

【讨论】:

    猜你喜欢
    • 2011-07-11
    • 2017-05-12
    • 2016-09-01
    • 2020-02-18
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-09-17
    • 2019-09-07
    相关资源
    最近更新 更多