#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. ДА. У вас были другие проблемы с вашим кодом, которые я не заметил в первый раз. Я обновил свой ответ, чтобы предоставить доказательства рабочего решения.