Передайте имя переменной функции, написанной пользователем, которая использует dyplr

#r #function

Вопрос:

Я пытаюсь написать функцию, которая индексирует имена переменных. В частности, в своей функции я использую mutate для кодирования переменную, которая у меня есть, без изменения ее имени. Кто-нибудь знает, как я могу индексировать переменную в левой части mutate?

Вот пример

 library(tydiverse)
# first create relevant dataset

iris <- iris%>% group_by(Species) %>% mutate(mean_Length=mean(Sepal.Length))

# second create my function
userfunction <- function(var){
  newdata <- iris  %>% 
    select(mean_Length,{var}) %>% distinct() %>% 
    mutate(get(var)= # this is what causes my function to fail. How can i refer to the `var` here?
factor(get(var),get(var))) %>% 
arrange(get(var)) # 
  return(newdata)
}
# this function produces the following error # Error: unexpected '}' in "}"

#note that if I change the reference to its original string the function works
userfunction2 <- function(var){
  newdata <- iris  %>% 
    select(mean_Length,{var}) %>% distinct() %>% 
    mutate(Species= # without reference it works, but I am unable to use the function for multiple variables. 
factor(get(var),get(var))) %>% 
arrange(get(var)) # 
  return(newdata)
}
encodedata<- userfunction2("Species")

 

Заранее большое спасибо за вашу помощь

Лучшие

Ответ №1:

Вот рабочий пример, который идет в том же направлении, что и ответ Лайми:

 iris <- datasets::iris %>%
  group_by(Species) %>%
  mutate(mean_Length=mean(Sepal.Length)) %>%
  ungroup()

userfunction <- function(var){
  iris  %>%
    transmute(mean_Length, "temp" = iris[[var]]) %>% 
    distinct() %>% 
    mutate("{var}" := factor(temp)) %>% 
    arrange(temp) %>%
    select(-temp)
}

userfunction("Petal.Length")
 

Ответ №2:

Я не думаю var , что это твоя проблема. Я думаю, что это то самое = . Если у вас есть переменная enquo ted в левой части задания (что фактически является тем, что у вас есть get() ), вам := это не нужно = .

Смотрите здесь для получения более подробной информации.

Я бы написал вашу функцию немного по-другому:

 userfunction <- function(data, var){
  qVar <- enquo(var)
  
  newdata <- data  %>% 
    select(mean_Length,  !! qVar) %>% distinct() %>% 
    mutate(!! qVar := factor(!! qVar, !! qVar)) %>% 
    arrange(!! qVar)  
  return(newdata)
}
 

Включение data параметра означает, что вы можете включить его в канал:

 encodedata <- iris %>% userfunction(Species)
encodedata
# A tibble: 3 x 2
# Groups:   Species [3]
  mean_Length Species   
        <dbl> <fct>     
1        5.01 setosa    
2        5.94 versicolor
3        6.59 virginica 
 

Комментарии:

1. Я попытался последовать вашему предложению и изменить = := , но я получаю следующую ошибку Error: The LHS of := must be a string or a symbol

2. ДА. У вас были другие проблемы с вашим кодом, которые я не заметил в первый раз. Я обновил свой ответ, чтобы предоставить доказательства рабочего решения.