2016-12-19 4 views
1

Это продолжение следующей нити:Динамическая переменная в 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 
+4

Пожалуйста, покажите небольшой воспроизводимый пример и ожидаемый результат на основе этого примера. – akrun

+1

«Проблема в том, что я не могу ничего сделать с функцией grepl, чтобы динамически указывать« элемент ». - Обычный способ был бы с «заменой», но я предполагаю, что есть специальный способ dplyr, возможно, охваченный виньеткой «нестандартной оценки». – Frank

+1

Пожалуйста, запомните данные 'dput()' sample data –

ответ

0

Если я правильно понимаю ваш вопрос, вы хотите иметь возможность динамически вводить оба шаблона и объект, который будет искать эти шаблоны в grepl? Лучшее решение для вас полностью зависит от того, как вы выбираете сохранение шаблонов и как вы выбираете сохранение объектов для поиска. У меня есть несколько идей, которые должны вам помочь.

Для динамических моделей попробуйте ввести список шаблонов, используя функцию вставки. Это позволит вам одновременно искать множество разных шаблонов.

grepl(paste(your.pattern.list, collapse="|"), item) 

Допустим, вы хотите настроить сценарий, в котором вы храните множество интересных шаблонов в каталоге. Возможно, он автоматически собирается с сервера или с другого выхода.Вы можете создавать списки шаблонов, если они находятся в отдельных файлах с помощью этого:

#set working directory 
setwd("/path/to/files/i/want") 

#make a list of all files in this directory 
inFilePaths = list.files(path=".", pattern=glob2rx("*"), full.names=TRUE) 

#perform a function for each file in the list 
for (inFilePath in inFilePaths) 
{ 
    #grepl function goes here 
    #if each file in the folder is a table/matrix/dataframe of patterns try this 
    inFileData = read_csv(inFilePath) 
    vectorData=as.vector(inFileData$ColumnOfPatterns) 
    grepl(paste(vectorData, collapse="|"), item) 

} 

Для динамического определения элемента, вы можете использовать практически идентичные Рамочный

#set working directory 
setwd("/path/to/files/i/want") 

#make a list of all files in this directory 
inFilePaths = list.files(path=".", pattern=glob2rx("*"), full.names=TRUE) 

#perform a function for each file in the list 
for (inFilePath in inFilePaths) 
{ 
    #grepl function goes here 
    #if each file in the folder is a table/matrix/dataframe of data to be searched try this 
    inFileData = read_csv(inFilePath) 
    grepl(pattern, inFileData$ColumnToBeSearched) 

} 

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