R 3.5.2:自定义函数内部的管道-找不到对象“列”

问题描述 投票:0回答:1

我在自定义函数中遇到管道问题。根据之前的帖子,我了解到函数内部的管道会创建另一个级别(?),这会导致我得到错误(请参见下文)。

我希望为具有数百个数字和分类变量的大型数据集编写摘要函数。我想选择在不同的数据帧(结构相似)上使用此选项,始终按某个因子变量分组并获取多列的摘要。

library(tidyverse)
data(iris)

iris %>% group_by(Species) %>% summarise(count = n(), mean = mean(Sepal.Length, na.rm = T))

# A tibble: 3 x 3
  Species    count  mean
  <fct>      <int> <dbl>
1 setosa        50  5.01
2 versicolor    50  5.94
3 virginica     50  6.59

我希望创建这样的函数:

sum_cols <- function (df, col) { 
df %>% 
group_by(Species) %>% 
summarise(count = n(), 
mean = mean(col, na.rm = T)) 
}

这是我得到的错误:

sum_cols(iris, Sepal.Length)

Error in mean(col, na.rm = T) : object 'Petal.Width' not found
Called from: mean(col, na.rm = T)

我已经有这个问题一段时间了,尽管我试图在以前的几篇文章中得到答案,但我还不太了解为什么会出现问题以及如何解决这个问题。

任何帮助将不胜感激,谢谢!

r dplyr pipe chaining
1个回答
0
投票

尝试搜索非标准评估(NSE)。

您可以在这里使用{{}}让R知道coldf中的列名。

library(dplyr)

sum_cols <- function (df, col) { 
  df %>% 
    group_by(Species) %>% 
    summarise(count = n(), mean = mean({{col}}, na.rm = T)) 
  }

sum_cols(iris, Sepal.Length)

# A tibble: 3 x 3
#  Species    count  mean
#  <fct>      <int> <dbl>
#1 setosa        50  5.01
#2 versicolor    50  5.94
#3 virginica     50  6.59
© www.soinside.com 2019 - 2024. All rights reserved.