流水线中'arrange()'的基本模拟

ryoqjall  于 2023-03-10  发布在  其他
关注(0)|答案(1)|浏览(189)

使用dplyr::filter()dplyr::mutate()的管道通常可以替换为基本R等价的subset()transform(),这在软件包开发中可能是一个好处。是否有arrange()的任何直接基本R类似物可以用于基本R管道?
当然有order(),但是在管道中的用法不像arrange()那么清楚。下面是我想到的最好的,但是它并不可爱:

set.seed(0)
dat <- data.frame(x = 1:5, y = sample(100, 5))
dat

library(dplyr)
dat |> 
  filter(x > 2) |> 
  mutate(z = y / x) |> 
  arrange(z)

# Using base-R only
dat |> 
  subset(x > 2) |> 
  transform(z = y / x) |> 
  {\(d) d[order(d$z), ]}()

结果:

x  y     z
4 4  1  0.25
5 5 34  6.80
3 3 39 13.00
yhived7q

yhived7q1#

我不认为有一个很好的基础等价于dplyr::arrange(),我们可以编写自己的函数,其行为类似于substitute(),我们称之为organize()

set.seed(0)
dat <- data.frame(x = 1:5, y = sample(100, 5))

organize <- function (df, ..., na.last = TRUE, decreasing = FALSE,
                      method = c("auto", "shell", "radix"), drop = FALSE) {
  method <- match.arg(method)
  dots <- eval(substitute(alist(...)))
  exprs <- lapply(dots, FUN = \(e) eval(e, df, parent.frame())) 
  arg_ls <- c(exprs,
              na.last = na.last,
              decreasing = decreasing,
              method = method
              )
  df[do.call("order", arg_ls), , drop = drop]
}

dat |>
  subset(select = 2) |>
  organize(y)
#>    y
#> 4  1
#> 1 14
#> 5 34
#> 3 39
#> 2 68

mtcars |>
  organize(gear, -mpg) |>
  head()
#>                    mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> Toyota Corona     21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
#> Hornet 4 Drive    21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#> Pontiac Firebird  19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
#> Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#> Valiant           18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#> Merc 450SL        17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3

创建于2023年3月8日,使用reprex v2.0.2

相关问题