gpt4 book ai didi

r - 如何使用 R 的 {collapse} 包来实现正确的 fgroup_by() |> ftransform() 输出?

转载 作者:行者123 更新时间:2023-12-02 02:01:44 25 4
gpt4 key购买 nike

{collapse}是一个 R 包,它允许更快地处理数据操作和描述性统计数据。一些功能 intentionally echoes {dplyr} .例如,比较以下 dplyr 代码与 collapse 代码。它们在语法上非常相似并产生相同的输出。

library(ggplot2)
library(dplyr, warn.conflicts = FALSE)
library(collapse, warn.conflicts = FALSE)
#> collapse 1.6.5, see ?`collapse-package` or ?`collapse-documentation`
#> Note: stats::D -> D.expression, D.call, D.name

using_dplyr <-
mpg |>
group_by(manufacturer) |>
summarise(mean_hwy = mean(hwy))

using_collapse <-
mpg |>
collapse::fgroup_by(manufacturer) |>
collapse::fsummarise(mean_hwy = mean(hwy))

identical(using_collapse, using_dplyr)
#> [1] TRUE

但是 {collapse} 只是更快

bench::mark(dplyr = 
mpg |>
group_by(manufacturer) |>
summarise(mean_hwy = mean(hwy)),

collapse =
mpg |>
fgroup_by(manufacturer) |>
fsummarise(mean_hwy = mean(hwy))) |>
autoplot()

reprex package 创建于 2021-08-26 (v2.0.0)


我的问题:
而以下表达式是类似的并且有效:
group_by() |> summarise() = fgroup_by() |> fsummrise(),
以下类比不起作用:
group_by() |> mutate() |> != fgroup_by() |> ftransform()。 (ftransform()collapse 等同于 dplyr::mutate())。

展示问题
让我们用两种等价的语法来展示同一个管道:

library(ggplot2)
library(dplyr, warn.conflicts = FALSE)
library(collapse, warn.conflicts = FALSE)
#> collapse 1.6.5, see ?`collapse-package` or ?`collapse-documentation`
#> Note: stats::D -> D.expression, D.call, D.name

is_bigger_than_mean <- function(x) {
x > mean(x)
}

## dplyr syntax
mutate_using_dplyr <-
mpg |>
select(manufacturer, hwy) |>
group_by(manufacturer) |>
mutate(hwy_bigger_than_mean = is_bigger_than_mean(hwy))

## collapse syntax
mutate_using_collapse <-
mpg |>
fselect(manufacturer, hwy) |>
fgroup_by(manufacturer) |>
ftransform(hwy_bigger_than_mean = is_bigger_than_mean(hwy))

比较 hwy_bigger_than_mean 列中的结果

mutate_using_dplyr  ## correct
#> # A tibble: 234 x 3
#> # Groups: manufacturer [15]
#> manufacturer hwy hwy_bigger_than_mean
#> <chr> <int> <lgl>
#> 1 audi 29 TRUE
#> 2 audi 29 TRUE
#> 3 audi 31 TRUE
#> 4 audi 30 TRUE
#> 5 audi 26 FALSE
#> 6 audi 26 FALSE
#> 7 audi 27 TRUE
#> 8 audi 26 FALSE
#> 9 audi 25 FALSE
#> 10 audi 28 TRUE
#> # ... with 224 more rows

mutate_using_collapse ## incorrect
#> # A tibble: 234 x 3
#> manufacturer hwy hwy_bigger_than_mean
#> * <chr> <int> <lgl>
#> 1 audi 29 TRUE
#> 2 audi 29 TRUE
#> 3 audi 31 TRUE
#> 4 audi 30 TRUE
#> 5 audi 26 TRUE
#> 6 audi 26 TRUE
#> 7 audi 27 TRUE
#> 8 audi 26 TRUE
#> 9 audi 25 TRUE
#> 10 audi 28 TRUE
#> # ... with 224 more rows
#>
#> Grouped by: manufacturer [15 | 16 (11)]

reprex package 创建于 2021-08-26 (v2.0.0)

造成差异的原因是什么?是否有可能实现正确的输出,使得 mutate_using_collapse 将提供与 mutate_using_dplyr 相同的输出?

注意:类似问题讨论类似问题here

最佳答案

正如 Konrad 指出的那样,ftransform() 不是 mutate() 的一对一替代品,因为它在设计上更受限制作用域,默认情况下不考虑分组数据,主要用于包中一组受限制的“快速”函数。

您可以使用 fmean() 函数来实现您的目标,但需要使用 GRP() 函数明确告诉它使用分组数据。

另请注意,它不适用于新的基础 R 管道,您需要使用 magrittr 管道使分组数据可用于函数调用。

library(ggplot2)
library(dplyr)
library(collapse)

mpg %>%
fselect(manufacturer, hwy) %>%
fgroup_by(manufacturer) %>%
ftransform(hwy_bigger_than_mean = hwy > fmean(hwy, GRP(.), TRA = "replace"))

# A tibble: 234 x 3
manufacturer hwy hwy_bigger_than_mean
* <chr> <int> <lgl>
1 audi 29 TRUE
2 audi 29 TRUE
3 audi 31 TRUE
4 audi 30 TRUE
5 audi 26 FALSE
6 audi 26 FALSE
7 audi 27 TRUE
8 audi 26 FALSE
9 audi 25 FALSE
10 audi 28 TRUE
# ... with 224 more rows

关于r - 如何使用 R 的 {collapse} 包来实现正确的 fgroup_by() |> ftransform() 输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68937921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com