【问题标题】:How do you calculate a running column minimum using tidyverse functions [duplicate]如何使用 tidyverse 函数计算运行列最小值 [重复]
【发布时间】:2020-08-22 16:04:47
【问题描述】:

我有两列数据框,type 和 val。我想使用 tidyverse 函数计算分组(按类型分组)运行列最小值。我尝试使用 dplyr 和 map 函数进行此操作,但没有得到目标输出。这是一个可重现的示例,其中包含我的实际和所需输出。我哪里错了?有没有更好的方法来实现这一点?

library(tidyverse)
library(reprex)


df <- tibble(type=c('m','m','m','m','m','m','m','m','m','m','f','f','f','f','f','f','f','f','f','f'),val=c(23,24,22,23,20,19,20,21,18,22,10,11,12,9,9,10,7,7,6,4))

df <- df %>% 
  group_by(type) %>% 
  mutate(run_min = map(val,~min(.,val))) %>% 
  unnest()

## OUTPUT THAT IM GETTING

print(df, n=20)
#> # A tibble: 20 x 3
#> # Groups:   type [2]
#>    type    val run_min
#>    <chr> <dbl>   <dbl>
#>  1 m        23      18
#>  2 m        24      18
#>  3 m        22      18
#>  4 m        23      18
#>  5 m        20      18
#>  6 m        19      18
#>  7 m        20      18
#>  8 m        21      18
#>  9 m        18      18
#> 10 m        22      18
#> 11 f        10       4
#> 12 f        11       4
#> 13 f        12       4
#> 14 f         9       4
#> 15 f         9       4
#> 16 f        10       4
#> 17 f         7       4
#> 18 f         7       4
#> 19 f         6       4
#> 20 f         4       4


## WANT THIS OUTPUT

## # A tibble: 20 x 3
## # Groups:   type [2]
##    type    val run_min
##    <chr> <dbl>   <dbl>
##  1 m        23      23
##  2 m        24      23
##  3 m        22      22
##  4 m        23      22
##  5 m        20      20
##  6 m        19      19
##  7 m        20      19
##  8 m        21      19
##  9 m        18      18
## 10 m        22      18
## 11 f        10      10
## 12 f        11      10
## 13 f        12      10
## 14 f         9       9
## 15 f         9       9
## 16 f        10       9
## 17 f         7       7
## 18 f         7       7
## 19 f         6       6
## 20 f         4       4

reprex package (v0.3.0) 于 2020 年 8 月 22 日创建

【问题讨论】:

    标签: r dplyr tidyverse purrr


    【解决方案1】:

    使用cummin:

    df %>% 
      group_by(type) %>% 
      mutate(run_min = cummin(val)) %>% 
      ungroup()
    
    # A tibble: 20 x 3
       type    val run_min
       <chr> <dbl>   <dbl>
     1 m        23      23
     2 m        24      23
     3 m        22      22
     4 m        23      22
     5 m        20      20
     6 m        19      19
     7 m        20      19
     8 m        21      19
     9 m        18      18
    10 m        22      18
    11 f        10      10
    12 f        11      10
    13 f        12      10
    14 f         9       9
    15 f         9       9
    16 f        10       9
    17 f         7       7
    18 f         7       7
    19 f         6       6
    20 f         4       4
    

    【讨论】:

      【解决方案2】:

      如果您专门寻找tidyverse 解决方案,那么dplyrpurrr 选项可能是:

      df %>%
       group_by(type) %>%
       mutate(run_min = accumulate(val, ~ ifelse(.x < .y, .x, .y)))
      
        type    val run_min
         <chr> <dbl>   <dbl>
       1 m        23      23
       2 m        24      23
       3 m        22      22
       4 m        23      22
       5 m        20      20
       6 m        19      19
       7 m        20      19
       8 m        21      19
       9 m        18      18
      10 m        22      18
      11 f        10      10
      12 f        11      10
      13 f        12      10
      14 f         9       9
      15 f         9       9
      16 f        10       9
      17 f         7       7
      18 f         7       7
      19 f         6       6
      20 f         4       4
      

      否则,您可以简单地使用cummin()

      df %>%
       group_by(type) %>%
       mutate(run_min = cummin(val))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-13
        • 2017-09-11
        • 2019-01-29
        • 1970-01-01
        • 2015-10-29
        • 1970-01-01
        • 1970-01-01
        • 2020-12-31
        相关资源
        最近更新 更多