Предположим следующую функцию
library(tidyverse)
nest_fun <- function(data, groups) {
data %>%
group_by(pick({{groups}})) %>%
nest() %>%
mutate(filename = paste({{groups}}[1], {{groups}}[2], "file.png", sep = "_"))
}
nest_fun(data = mtcars, groups = c(vs, am))
# # A tibble: 4 × 4
# # Groups: vs, am [4]
# vs am data filename
# <dbl> <dbl> <list> <chr>
# 1 0 1 <tibble [6 × 9]> 0_1_file.png
# 2 1 1 <tibble [7 × 9]> 1_1_file.png
# 3 1 0 <tibble [7 × 9]> 1_0_file.png
# 4 0 0 <tibble [12 × 9]> 0_0_file.png
Функция работает нормально, пока я группирую ровно по 2 переменным. Как я мог написать функцию, чтобы я мог группировать по произвольному количеству переменных и при этом получать правильное имя файла?
@Limey, опубликуй как ответ ... он проще, чем мой (так как удален), намного понятнее и меньше изменений. (Хотя я поддерживаю свою рекомендацию добавить аргумент для data=
по умолчанию mtcars
:-).
@Limey Спасибо, я приму, если вы опубликуете в качестве ответа.
@r2evans: нечасто я и быстрее, и лучше тебя! Это для альбома... ;=)
Аргумент collapse
функции paste
(и paste0
) вставляет элементы вектора, тогда как sep
вставляет аргументы вызова. Поэтому вы можете получить то, что хотите, с помощью вложенных вызовов paste
/paste0
.
Я решительно поддерживаю комментарий @r2evans о предоставлении фрейма данных в качестве аргумента вашей функции. Это просто хорошая практика (и позволяет вам передать свою функцию, если хотите). Я вижу, вы уже сделали это в вопросе. Однако использование data
— имени встроенной функции — не идеально.
Так...
library(tidyverse)
nest_fun <- function(d=mtcars, groups = c(vs, am)) {
d %>%
group_by(pick({{groups}})) %>%
nest() %>%
mutate(filename = paste0(paste({{groups}}, collapse = "_"), "_file.png"))
}
nest_fun()
# A tibble: 4 × 4
# Groups: vs, am [4]
vs am data filename
<dbl> <dbl> <list> <chr>
1 0 1 <tibble [6 × 9]> 0_1_file.png
2 1 1 <tibble [7 × 9]> 1_1_file.png
3 1 0 <tibble [7 × 9]> 1_0_file.png
4 0 0 <tibble [12 × 9]> 0_0_file.png
mtcars %>% nest_fun(c(vs, am, gear))
# A tibble: 7 × 5
# Groups: vs, am, gear [7]
vs am gear data filename
<dbl> <dbl> <dbl> <list> <chr>
1 0 1 4 <tibble [2 × 8]> 0_1_4_file.png
2 1 1 4 <tibble [6 × 8]> 1_1_4_file.png
3 1 0 3 <tibble [3 × 8]> 1_0_3_file.png
4 0 0 3 <tibble [12 × 8]> 0_0_3_file.png
5 1 0 4 <tibble [4 × 8]> 1_0_4_file.png
6 0 1 5 <tibble [4 × 8]> 0_1_5_file.png
7 1 1 5 <tibble [1 × 8]> 1_1_5_file.png
nest_fun()
... mutate(filename = paste0(paste({{groups}}, collapse = "_"), "_file.png"))
.