У меня есть функция, которая принимает фрейм данных и должна собирать его по разным столбцам в зависимости от переданного набора данных. Поэтому мне нужен способ сообщить функции gather()
, какие столбцы нужно собирать динамически.Мне любопытно, если передача столбцов функции в виде строк, а затем использование noqoute()
- лучший способ сделать это.Код в настоящее время работает, но я чувствую, что, возможно, упускаю что-то, что может в конечном итоге сломать код.Вот мой код:
library(tidyverse)
# Data will always take a wide format similar to this
raw_dat <- tibble(id = 1:30,
garbage = letters[runif(30, min = 1, max = 26)],
group1 = runif(30, min = 200, max = 5000),
group2 = runif(30, min = 200, max = 5000),
group3 = runif(30, min = 200, max = 5000),
group4 = runif(30, min = 200, max = 5000),
group5 = runif(30, min = 200, max = 5000),
garbage2 = letters[runif(30, min = 1, max = 26)],
garbage3 = letters[runif(30, min = 1, max = 26)])
raw_dat
#> # A tibble: 30 x 9
#> id garbage group1 group2 group3 group4 group5 garbage2 garbage3
#> <int> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <chr> <chr>
#> 1 1 n 2234. 4852. 4745. 4381. 3331. v l
#> 2 2 y 3749. 2084. 2555. 3445. 3288. y e
#> 3 3 x 1796. 1088. 2300. 2425. 2124. u j
#> 4 4 m 3912. 646. 497. 4669. 2532. g c
#> 5 5 y 344. 559. 1989. 4459. 4139. x m
#> 6 6 k 4671. 1215. 1568. 3802. 1536. y p
#> 7 7 g 3117. 3797. 391. 3192. 2695. t l
#> 8 8 x 230. 1277. 4450. 3437. 1235. c o
#> 9 9 x 491. 871. 4559. 4010. 4478. b r
#> 10 10 l 292. 701. 903. 2308. 4573. e e
#> # … with 20 more rows
# This number will change by varying datasets and user entry
input_groups <- names(raw_dat)[3:7]
# My function does more than this but I am concerned with making this part dynamic
compute_values <- function(df, input_g){
df %>%
gather(key = "input_group", value = "input_value", noquote(input_g))
}
compute_values(raw_dat, input_groups)
#> # A tibble: 150 x 6
#> id garbage garbage2 garbage3 input_group input_value
#> <int> <chr> <chr> <chr> <chr> <dbl>
#> 1 1 n v l group1 2234.
#> 2 2 y y e group1 3749.
#> 3 3 x u j group1 1796.
#> 4 4 m g c group1 3912.
#> 5 5 y x m group1 344.
#> 6 6 k y p group1 4671.
#> 7 7 g t l group1 3117.
#> 8 8 x c o group1 230.
#> 9 9 x b r group1 491.
#> 10 10 l e e group1 292.
#> # … with 140 more rows
Создано в 2019-03-07 пакетом Представить (v0.2.1)