在dplyr的across内的自定义函数中指定参数时出现问题

nvbavucw  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(123)

当我在dplyr的across中查找传递给.fns参数的自定义函数中指定参数时遇到了一些麻烦。

data(iris)

ref_col <- "Sepal.Length"

iris_summary <- iris %>%
  group_by(Species) %>%
  summarise(
    Sepal.Length_max = max(Sepal.Length),
    across(
      Sepal.Width:Petal.Width,
      ~ .x[which.max(get(ref_col))]
    )
  )

接下来我需要用一个自定义函数替换lambda函数,然后将inside请求的参数传递给across(在我的代码中,自定义函数比较复杂,嵌入dplyr管道中也不方便),请看下面的代码:

ref_col <- "Sepal.Length"

get_which_max <- function(x, col_max) x[which.max(get(col_max))]

iris_summary <- iris %>%
  group_by(Species) %>%
  summarise(
    Sepal.Length_max = max(Sepal.Length),
    across(
      Sepal.Width:Petal.Width,
      ~ get_which_max(.x, ref_col)
    )
  )

R现在给出错误“object 'Sepal.Length' not found”,因为它在管道进程中查找一个对象而不是列名。有人能帮我解决这个问题吗?

v1l68za4

v1l68za41#

我们可以使用cur_data()pick(来自dplyr的devel版本)来选择列。另外,从get_which_max中删除get

get_which_max <- function(x, col_max) x[which.max(col_max)]

iris_summary <- iris %>%
  group_by(Species) %>%
  summarise(
    Sepal.Length_max = max(Sepal.Length),
    across(
      Sepal.Width:Petal.Width,
      ~ get_which_max(.x, cur_data()[[ref_col]])
    )
  )
  • 输出
# A tibble: 3 × 5
  Species    Sepal.Length_max Sepal.Width Petal.Length Petal.Width
  <fct>                 <dbl>       <dbl>        <dbl>       <dbl>
1 setosa                  5.8         4            1.2         0.2
2 versicolor              7           3.2          4.7         1.4
3 virginica               7.9         3.8          6.4         2

相关问题