如何解决如何使用tidyverse函数计算运行列最小值
我有包含两列的数据框,类型和值。我想使用tidyverse函数计算一个分组的(按类型分组)运行列最小值。我尝试使用dplyr和map函数进行此操作,但没有获得我瞄准的输出。这是一个可复制的示例,其中包含我的实际输出和所需输出。我要去哪里错了?有没有更好的方法来实现这一目标?
library(tidyverse)
library(reprex)
df <- tibble(type=c('m','m','f','f'),val=c(23,24,22,23,20,19,21,18,10,11,12,9,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-08-22创建
解决方法
使用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
,
如果您正在专门寻找一种tidyverse
解决方案,那么一个dplyr
和purrr
选项可能是:
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))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。