我正在尝试在向量中使用字符串来调出另一个向量,以便所有内容都将在paste命令中输出 . 然后我使用这些字符向量来过滤掉数据帧 .
使用mtcars数据框作为示例(将行名称转换为列,以便我可以使用某些字符)...
df < - mtcars df $ Cars < - rownames(df)
我对以下向量感兴趣
allSearches = c(“SearchA”,“Search1”)
并且“SearchA”和“Search1”被定义为......
SearchA = c(“mazda”,“honda”)Search1 = c(“merc”,“toyota”)
我希望能够通过SearchA中的变量过滤数据框df,然后通过Search1中的变量过滤数据框df .
对于单独的代码行,我可以使用以下代码...
sub = df [grepl(paste(Search1,collapse =“|”),df $ Cars,ignore.case = T),] sub $ SearchA < - “是”df = merge(df,sub,all.x = T)
这样做的目的是让它处于“for”循环中,以便我可以在需要时添加其他搜索 .
我试过以下......
for(i in 1:length(allSearches)){sub = df [grepl(paste(allSearches [i],collapse =“|”),df $ Cars,ignore.case = T),] sub [,allSearches [ i]] < - “是”df = merge(df,sub,all.x = T)}
但我得到以下错误......
[< - . data.frame(* tmp * ,, allSearches [i],value =“Yes”)出错:替换有1行,数据有0
在尝试剖析问题时,我发现这个特定方法的问题在于“粘贴”功能,其中...
粘贴(allSearches [1],collapse =“|”)
输出以下内容......
“SearchA”
而不是完整的矢量
[1]“mazda”“honda”
任何帮助将不胜感激 . 我正在处理很多适合“allSearches”内部的“搜索”,因此在循环中获取所有内容会很好,这样我就不必为每个过滤器做3行 . 此外,不同“搜索”的矢量名称不遵循任何特定模式 .
谢谢! JCB
3 回答
您也可以保留以前的代码并使用
get
:在你的循环中,如果你替换
sub = df[grepl(paste(allSearches[i],collapse="|"), df$Cars, ignore.case=T),]
通过
它应该工作 .
你也可以使用
Map
更新
如果需要
merge
跨groups
的Seach
模式数据
好的,这是你需要改变的 .
我唯一改变的是
paste(get(allSearches[i]), collapse="|")
. 当您使用get
时,它会尝试获取包含这些名称的向量最后你可以把: