Это продолжение следующей нити:Динамическая переменная в grepl()
Creating Binary Identifiers Based On Condition Of Word Combinations For Filter
Ожидаемый результат такой же, как на указанной нити.
Теперь я пишу функцию, которая может принимать динамические имена в качестве переменных.
Это код, который я стремлюсь на, если я запустить его вручную:
df <- df %>% group_by(id, date) %>% mutate(flag1 = if(eval(parse(text=conditions))) grepl(pattern, item_name2) else FALSE)
Для того, чтобы это учитывать динамические имена переменных, я делал этот код, так:
groupcolumns <- c(id, date)
# where id and date will be entered into the function as character strings by the user
variable <- list(~if(eval(parse(text=conditions))) grepl(pattern, item) else FALSE)
# converting to formula to use with dynamically generated column names
# "conditons" being the following character vector, which I can automatically generate:
conditons <- "any(grepl("Alpha", Item)) & any(grepl("Bravo", Item))"
Это становится:
df <- df %>% group_by_(.dots = groupcolumns) %>% mutate_(.dots = setNames(variable, flags[1]))
# where flags[1] is a predefined vector of columns names that I have created
flags <- paste("flag", seq(1:100), sep = "")
проблема заключается в том, что я не в состоянии сделать что-нибудь к grepl функция; для динамического определения «элемента». Если я делаю это так, как «df $ item», и делаю eval (parse (text = «df $ item»)), намерение трубопровода терпит неудачу, поскольку я делаю group_by_, и это приводит к ошибке (естественно). Это также относится к условиям, которые я установил.
Есть ли способ, чтобы я мог сказать grepl использовать имя динамической переменной?
Большое спасибо (особенно для akrun)!
редактировать 1:
попробовал следующее, и теперь нет никаких проблем передачи имени элемента в grepl.
variable <- list(~if(eval(parse(text=conditions))) grepl(pattern, as.name(item)) else FALSE)
Тем не менее, проблема заключается в том, что трубопровод, похоже, не работает, как выход as.name (пункт) рассматривается как объект, который не существует в окружающей среде.
редактировать 2:
пытаются делать() в dplyr:
variable <- list(~if(eval(parse(text=conditions))) grepl(pattern, .$deparse(as.name(item))) else FALSE)
df <- df %>% group_by_(.dots = groupcolumns) %>% do_(.dots = setNames(variable, combiflags[1]))
, который бросает мне ошибку:
Error: object 'Item' not found
Пожалуйста, покажите небольшой воспроизводимый пример и ожидаемый результат на основе этого примера. – akrun
«Проблема в том, что я не могу ничего сделать с функцией grepl, чтобы динамически указывать« элемент ». - Обычный способ был бы с «заменой», но я предполагаю, что есть специальный способ dplyr, возможно, охваченный виньеткой «нестандартной оценки». – Frank
Пожалуйста, запомните данные 'dput()' sample data –