Во-первых, это мой первый вопрос по StackOverflow, я надеюсь, что напишу это хорошо.Если нет, не стесняйтесь сказать мне ... И извините за мой примерный английский!
Я хотел бы использовать функцию mutate из dplyr, чтобы изменить тип столбцов data.frame, ноне зная заранее нового типа.Таким образом, я хотел бы динамически создать имя функции (например, «as.numeric», «as.factor»), беря новый тип из другого data.frame.
Вот конкретный пример (что яЯ хочу сделать это для data.frames с более чем 100 переменными, так что вы поймете, что я не хочу делать это вручную!):
library(tidyverse)
df <- data.frame(Name = c("Roger", "Steve"), Age = c("40", "32"), stringsAsFactors = FALSE)
glimpse(df)
Observations: 2
Variables: 2
$ Name <chr> "Roger", "Steve"
$ Age <chr> "40", "32"
types <- data.frame(Field = c("Name", "Age"), OldType = c("character", "character"), NewType = c("factor", "integer"), stringsAsFactors = FALSE)
glimpse(types)
Observations: 2
Variables: 3
$ Field <chr> "Name", "Age"
$ OldType <chr> "character", "character"
$ NewType <chr> "factor", "integer"
Я искал в течение длительного времени и нашел многодокументация по квази-цитате, и я попробовал несколько вещей, но так и не получил ожидаемого результата.Вот две попытки, которые я сделал:
# First attempt
for(i in 1:nrow(types)){
field <- types$Field[i]
field_quo <- enquo(field)
new_type <- paste0("as.", types$NewType[i], "(", field, ")")
new_type_quo <- enquo(new_type)
df <- df %>% mutate(!!field_quo := !!new_type_quo)
}
glimpse(df)
Observations: 2
Variables: 2
$ Name <chr> "as.factor(Name)", "as.factor(Name)"
$ Age <chr> "as.integer(Age)", "as.integer(Age)"
=> вызовы функций считаются строками, а значения столбцов заменяются вместо их типов.
# Second attempt
for(i in 1:nrow(types)){
field <- types$Field[i]
field_quo <- ensym(field)
new_type <- paste0("as.", types$NewType[i], "(", field, ")")
new_type_quo <- ensym(new_type)
df <- df %>% mutate(!!field_quo := !!new_type_quo)
}
Здесь яполучить сообщение об ошибке:
Error in mutate_impl(.data, dots) : Binding not found: as.factor(Name).
Я полагаю, что функция mutate рассматривает то, что в скобках, как целое имя переменной?
Я пробовал другие вещи, но безуспешно.Я должен признать, что я не являюсь экспертом в области R, и мне трудно полностью понять эту концепцию квазиквотирования, несмотря на качество документации.Итак, я знаю, что я делаю вещи неправильно, но я не знаю, почему и как это сделать правильно ... Может кто-то помочь?
Спасибо!