【发布时间】:2019-03-20 15:42:11
【问题描述】:
这可能已经在某个地方得到了回答,但我找不到答案...标记为重复并按你喜欢的方式投反对票,但请有人帮助我:)
小问题
如何在函数内部将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作者)。
【问题讨论】:
-
如果字符串
"NULL"没有出现在您的数据中,您能否将NULL替换为其等效字符串? -
C 总是 NULL 吗?
-
@RandallHelms 并非总是如此,与长篇解释中的想法相同。
-
我想我的例子在翻译中有点丢失了。原则是有的,但他们缺乏理由。我首先从一个自定义类在我的函数中创建了一个对象,对其进行了很多修改,然后我将对象中的一个 data.frame 传递给那些有条件的
dplyr管道。NULLs 实际上是控制是否应该绘制某些元素的参数。 -
这是一篇关于使用
NULL与NAr-bloggers.com/r-na-vs-null 的好帖子。c不应列为 NULL 而c应为NA,试试这个,看看哪个有效:group_by(mtcars, cyl, mpg, NA) group_by(mtcars, cyl, mpg, NULL)
标签: r if-statement dplyr