Передача кадра данных параметров в pmap (purrr)

Следуя указаниям Хэдли Викамса по науке о данных, я хочу передать набор данных параметров пользовательской функции.

Тем не менее, поскольку параметры хранятся в виде символов в кадре данных ( df_params), у меня возникают проблемы с оценкой, в частности с оценкой моего параметра df. Например, вот функция:

`f <- function(df, group1, region1) {
        g1 <- as.name(group1)
        reg1 <- enquo(region1)
        x <- filter(df, (!!g1) == !!reg1) %>% select(country) 
       print(x)
    } 

У меня нет проблем с передачей f(df, 'group', 'region'). Однако я хочу, чтобы f('df', 'group', 'region') оценивал 'df' как объект в моей глобальной среде вместо символа.

Я предполагаю (надеюсь), что исправив это, я смогу пройти

df_params %>% pmap(f)

Любая помощь приветствуется.

1 ответ

Решение

Вы не предоставили данные, поэтому я создал поддельные данные, чтобы продемонстрировать их решение. То, что вы ищете, скорее всего, get() функция.

Сначала для некоторых поддельных данных

> df1 <- data.frame(animal1 = rep(c('cat','dog'),5),
+                   animal2 = c(rep(c('cat','snake','dog'),3), 'dog'),
+                   country = c('USA','USA','USA','NK','NK','NK','NK','USA','MEX','MEX'),
+                   stringsAsFactors = F)

   animal1 animal2 country
1      cat     cat     USA
2      dog   snake     USA
3      cat     dog     USA
4      dog     cat      NK
5      cat   snake      NK
6      dog     dog      NK
7      cat     cat      NK
8      dog   snake     USA
9      cat     dog     MEX
10     dog     dog     MEX

Это ваша текущая функция, которая дает вывод ниже:

> f <- function(df, group1, region1) {
+   g1 <- as.name(group1)
+   reg1 <- enquo(region1)
+   x <- filter(df, (!!g1) == !!reg1) %>% select(country) 
+   print(x)
+ } 
> 
> f(df1, 'animal1', 'dog')
  country
1     USA
2      NK
3      NK
4     USA
5     MEX

Мы можем изменить это, просто добавив get(df) к вашей функции фильтра. Вы можете видеть, что это дает нам тот же результат.

> f2 <- function(df, group1, region1) {
+   g1 <- as.name(group1)
+   reg1 <- enquo(region1)
+   x <- filter(get(df), (!!g1) == !!reg1) %>% select(country) 
+   print(x)
+ } 
> 
> f2('df1', 'animal1', 'dog')
  country
1     USA
2      NK
3      NK
4     USA
5     MEX
Другие вопросы по тегам