我在自定义函数中遇到管道问题。根据之前的帖子,我了解到函数内部的管道会创建另一个级别(?),这会导致我得到错误(请参见下文)。
我希望为具有数百个数字和分类变量的大型数据集编写摘要函数。我想选择在不同的数据帧(结构相似)上使用此选项,始终按某个因子变量分组并获取多列的摘要。
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)
我已经有这个问题一段时间了,尽管我试图在以前的几篇文章中得到答案,但我还不太了解为什么会出现问题以及如何解决这个问题。
任何帮助将不胜感激,谢谢!
尝试搜索非标准评估(NSE)。
您可以在这里使用{{}}
让R知道col
是df
中的列名。
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