Передать список имен переменных в функцию, используя {{foo}} - PullRequest
1 голос
/ 03 октября 2019

Проблема

Я хотел бы знать, как передать список имен переменных в функцию purrr::map2 с целью итерации по отдельному фрейму данных.

input_table$keyПеременная ниже содержит mpg и disp из набора данных mtcars. Я думаю, что имена переменных передаются в виде символьных строк, а не имен переменных. Вопрос в том, как я могу изменить это так, чтобы моя функция распознала, что они являются именами переменных (?).

В этом примере я пытаюсь суммировать все значения в mtcars переменных mpg иdisp, которые падают ниже набора числовых порогов. Эти переменные из mtcars и соответствующие пороговые значения содержатся в input_table (ниже).

Идеальный результат

percentile   key    value  sum_y
  <fct>     <chr>   <dbl>  <dbl>
1 0.5        mpg    19.2   266.5
2 0.9        mpg    30.1   515.8
3 0.99       mpg    33.4   609.0
4 1          mpg    33.9   642.9
5 ...        ...    ...    ...

Попытка

library(dplyr)
library(purrr)
library(tidyr)
# Arrange a generic example
# Replicating my data structure
input_table <- mtcars %>% 
  as_tibble() %>% 
  select(mpg, disp) %>% 
  map_df(quantile, probs = c(0.5, 0.90, 0.99, 1)) %>% 
  mutate(
    percentile = factor(c(0.5, 0.90, 0.99, 1))
  ) %>% 
  select(
    percentile, mpg, disp
  ) %>% 
  gather(key, value, -percentile)

# Defining the function
test_func <- function(label_desc, threshold) {
  mtcars %>% 
    select({{label_desc}}) %>% 
    filter({{label_desc}} <= {{threshold}}) %>% 
    summarise(
      sum_y = sum(as.numeric({{label_desc}}), na.rm = T)
    )
}

# Demo'ing that it works for a single variable and threshold value
test_func(label_desc = mpg, threshold = 19.2)

# This is where I am having trouble
# Trying to iterate over multiple (mpg, disp) variables
map2(input_table$key, input_table$value, ~test_func(label_desc = .x, threshold = .y))

1 Ответ

1 голос
/ 03 октября 2019

Проблема curly-curly ({{}}) используется для переменных без кавычек, которые вы используете в своей первой попытке. Во второй попытке вы передаете переменные в кавычках, в которых оператор curly-curly не работает. Простым решением будет использование _at вариантов dplyr, которые принимают аргументы в кавычках.

test_func <- function(label_desc, threshold) {
  mtcars %>% 
    filter_at(label_desc, any_vars(. <= threshold)) %>% 
    summarise_at(label_desc, sum)
}

purrr::map2(input_table$key, input_table$value, test_func)

#[[1]]
#    mpg
#1 266.5

#[[2]]
#    mpg
#1 515.8

#[[3]]
#  mpg
#1 609

#[[4]]
#    mpg
#1 642.9

#[[5]]
#    disp
#1 1956.7
#.....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...