【发布时间】:2021-08-23 22:35:05
【问题描述】:
我正在尝试编写一个函数,该函数将数据框的列名作为... 参数并在dplyr::mutate 函数调用中将其传递给is.na。以下玩具示例说明了基本目标:
library(tidyverse)
df <- tribble(
~id, ~value,
"a", 1,
"a", 2,
NA, 3,
"b", 4
)
df %>%
group_by(id) %>%
mutate(avg = if_else(is.na(id), NA_real_, mean(value)))
以上产生了预期的结果,但不是通过函数。
以下函数有效,但不会根据需要使用 NA 填充 avg 列:
my_fun1 <- function(.data, ...) {
.data %>%
group_by(...) %>%
mutate(avg = mean(value))
}
my_fun1(df, id)
以下函数产生一个错误,指示“is.na() 应用于'closure'类型的非(列表或向量)”:
my_fun2 <- function(.data, ...) {
.data %>%
group_by(...) %>%
mutate(avg = if_else(is.na(...), NA_real_, mean(value)))
}
my_fun2(df, id)
为什么会出现此错误,如何避免?
【问题讨论】:
-
如果您在分组中传递多于一列,那么
if_else是如何工作的 -
当你使用
...时,用户可以输入id1、id2等。假设,如果有多个输入,is.na(...)会假设这样做在多列上,它将是一个矩阵 -
我明白了。有没有办法使用
...让用户只能输入一列?如果是这样,那能解决问题吗? -
一般
...用于多列输入或假设我们不知道OP有多少组。如果你有一个固定的。为什么不创建一个正式的论点,即function(.data, grpcol) -
您可以查看发布的解决方案,因为它更直接