Возможно, на этот вопрос уже где-то был дан ответ, но я не могу найти ответ ... Отметьте как дубликат и понизьте голос, как вам нравится, но кто-то, пожалуйста, помогите мне:)
Короткий вопрос
Как я могу передать 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
от того же автора).