У меня есть небольшой DSL, позволяющий группировать переменные по их именам:
group <- function(.data, ...) {
dots <- quos(...)
for (i in 1:length(dots)) {
in_group <- as.character(dots[[i]])[2]
vec <- trimws(unlist(strsplit(in_group, "[+]")))
.data <- cbind(.data, TRUE)
names(.data) <- c(names(.data)[-length(names(.data))], paste0("group_", names(dots[i])))
.data[, ncol(.data)] <- .data$vars %in% vec
}
return(.data)
}
library(magrittr)
# Some data
df <- data.frame(
vars = c("one", "two", "three", "four"), stringsAsFactors = FALSE
)
# Define a group called abc containing elements two, three and four:
df %>% group(abc = two + three + four)
vars group_abc
1 one FALSE
2 two TRUE
3 three TRUE
4 four TRUE
# Define multiple groups
df %>% group(odd = one + three, even = two + four, prime = one + two + three)
vars group_odd group_even group_prime
1 one TRUE FALSE TRUE
2 two FALSE TRUE TRUE
3 three TRUE FALSE TRUE
4 four FALSE TRUE FALSE
Однако это не позволяет переопределять группы:
df %>% group(abc = two + three + four) %>% group(abc = two)
vars group_abc group_abc
1 one FALSE FALSE
2 two TRUE TRUE
3 three TRUE FALSE
4 four TRUE FALSE
Группа abc определяется два разавместо того, чтобы перезаписываться.
Я пытался:
group2 <- function(.data, ...) {
dots <- quos(...)
for (i in 1:length(dots)) {
in_group <- as.character(dots[[i]])[2]
vec <- trimws(unlist(strsplit(in_group, "[+]")))
if (any(grepl(names(dots[i]), names(.data)))) {
.data[, grepl(names(dots[i]), names(.data))] <- .data$vars %in% vec
} else {
.data <- cbind(.data, TRUE)
names(.data) <- c(names(.data)[-length(names(.data))], paste0("group_", names(dots[i])))
.data[, ncol(.data)] <- .data$vars %in% vec
}
}
return(.data)
}
df %>% group2(abc = two + three + four) %>% group2(abc = two)
vars group_abc
1 one FALSE
2 two TRUE
3 three FALSE
4 four FALSE
Этот вид работает, но выглядит крайне некрасиво ..
Так что мой вопрос: Что хорошегоспособ переопределить группы в моем group
DSL?
Спасибо за любые подсказки.
Еще немного контекста:
Вот другой мой вопрос, касающийся этой общей темы моего DSL