Здесь я пытаюсь ввести семантику dplyr::select() в функцию, предоставляемую dplyr::mutate(). Ниже приведен минимальный пример.
dat <- tibble(class = rep(c("A", "B"), each = 10),
x = sample(100, 20),
y = sample(100, 20),
z = sample(100, 20))
.reorder_rows <- function(...) {
x <- list(...)
y <- as.matrix(do.call("cbind", x))
h <- hclust(dist(y))
return(h$order)
}
dat %>%
group_by(class) %>%
mutate(h_order = .reorder_rows(x, y, z))
## class x y z h_order
## <chr> <int> <int> <int> <int>
## 1 A 85 17 5 1
## 2 A 67 24 35 5
## ...
## 18 B 76 7 94 9
## 19 B 65 39 85 8
## 20 B 49 11 100 10
##
## Note: function applied across each group, A and B
То, что я хотел бы сделать, это что-то вроде:
dat %>%
group_by(class) %>%
mutate(h_order = .reorder_rows(-class))
Причина, по которой это важно, заключается в том, что когда dat
имеет гораздо больше переменных, мне нужно иметь возможность исключить группирующие/конкретные переменные из расчета функции.
Я не уверен, как это будет реализовано, но каким-то образом использование семантики выбора в функции .reorder_rows
может быть одним из способов решения этой проблемы.