这是以下主题的延续:
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函数做任何事情;指定&#34;项目&#34;动态。如果我这样做,就像&#34; df $ item&#34;,并做一个eval(解析(text =&#34; df $ item&#34;)),管道的意图就像我在做的那样失败group_by_会导致错误(自然)。这也适用于我设定的条件。
我是否有办法告诉grepl使用动态变量名?
非常感谢(尤其是对akrun)!
编辑1:
尝试了以下内容,现在没有问题将项目名称传递给grepl。
variable <- list(~if(eval(parse(text=conditions))) grepl(pattern, as.name(item)) else FALSE)
然而,问题在于管道似乎不起作用,因为as.name(item)的输出被视为一个对象,它在环境中不存在。
编辑2:
在dplyr中尝试do():
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
答案 0 :(得分:1)
如果我正确理解你的问题,你希望能够在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)
}
如果这与您想象的相距太远,请更新您的问题,详细说明您使用的数据是如何存储的。