这个问题可能已经有人回答过了,但我找不到答案...您可以将其标记为重复并进行踩,但请有人帮助我 :)
简短的问题
如何在函数内将NULL
传递给dplyr::group_by
?
library(dplyr)
dt <- data.frame(a = sample(LETTERS[1:2], 100, replace = TRUE), b = sample(LETTERS[3:4], 100, replace = TRUE), value = rnorm(100,5,1))
f1 <- function(dt, a, b, c) {
dt %>% group_by(a, b, c) %>% summarise(mean = mean(value))
}
f1(dt, a = "a", b = "b", c = NULL)
# Error in grouped_df_impl(data, unname(vars), drop) :
# Column `c` is unknown
长说明
我正在编写一个函数,其中“b”列可以被指定为 NULL
,这意味着该函数应忽略此列。如果将“b”列指定为字符,则函数应使用该列来汇总数据。就像这样:
f2 <- function(dt, a, b) {
if(is.null(b)) {
dt %>% group_by(a) %>% summarize(mean = mean(value))
} else {
dt %>% group_by(a, b) %>% summarize(mean = mean(value))
}
}
实际函数相当复杂冗长,使用dplyr管道使所有汇总代码更短。我有多个条件导致不同的输出和汇总选择,因此我通过先进行分组再在单独的步骤中进行汇总来缩短if else语句。
f3 <- function(dt, a, b, type = "mean") {
if(is.null(b)) {
tmp <- dt %>% group_by(a)
} else {
tmp <- dt %>% group_by(a, b)
}
if(type == "mean") {
tmp %>% summarize(mean = mean(value))
} else {
tmp %>% summarise(sum = sum(value))
}
}
如果可以将
NULL
传递给group_by
函数,我可以大大缩短代码(因为NULL
本来就是空的,像reshape2::melt
这样的许多函数都可以使用此方法)。
dplyr
管道。NULL
实际上是控制是否应该绘制某些元素的参数。 - MikkoNULL
与NA
的好文章:https://www.r-bloggers.com/r-na-vs-null/。在列表中,`c`不应被列为`NULL`,而应该是`NA`。尝试以下代码并查看哪个有效:`group_by(mtcars, cyl, mpg, NA)和
group_by(mtcars, cyl, mpg, NULL)`。 - Mike