【问题标题】:pattern matching a formula in R模式匹配 R 中的公式
【发布时间】:2020-02-25 08:44:22
【问题描述】:

我想对公式中的变量进行模式匹配。 理想的解决方案应该能够执行如下: formula <- 'variable_1+variable_2*variable_3-variable_4/variable_5 + 456' 和输出应该是 variable_1variable_2variable_3variable_4variable_5.

注意:变量名可以包含字符、下划线(_)、只能是数字,操作仅限于+、-、*、/。公式也可能包含常量(比如这里是 456)。输出应仅包含变量名称,并应忽略任何数字常量。

我已经尝试了以下代码。我只能检查包含 only character 的变量名,而减号操作 (-) 也不起作用。

formula <- "variableX +variableY*VariableZ"

strapplyc(gsub(" ", "", format(formula), fixed = T), "-?|[a-zA-Z_]+", simplify = T, ignore.case = T) 给出以下输出

   [,1]       
[1,] "variableX"
[2,] ""         
[3,] "variableY"
[4,] ""         
[5,] "VariableZ" 

这是正确的,但是当我包含减号操作 (-) 时,strapplyc 会给出错误的结果 formula <- "variableX -variableY" strapplyc(gsub(" ", "", format(formula), fixed = T), "-?|[a-zA-Z_]+", simplify = T, ignore.case = T) 给出以下输出

   [,1]       
[1,] "variableX"
[2,] "-"         
[3,] "variableY"

如果有人能帮助我找到理想的解决方案,我将不胜感激。

【问题讨论】:

    标签: r pattern-matching string-matching


    【解决方案1】:

    您可以为此使用正则表达式:

    formula <- "variable_1+variable_2*variable_3-variable_4/variable_5"
    gsub("[\\+\\*\\-\\/]", ", ", formula)
    

    正则表达式的解释:

    • [] 开始和结束您要选择的一组字符
    • \\+ 转义 + 号,你想用“,”替换
    • \\* 转义 * 符号,你想用“,”替换
    • \\- 转义 - 符号,您要替换为“,”
    • \\/ 转义 / 符号,你想用“,”替换

    编辑以反映 OP 的更新请求

    另一种方法是提取变量。如果您的变量名称采用 lowercaseletters_number 格式,则以下方法有效:

    formula <- "variable_1+variable_2*variable_3-variable_4/variable_5+34+brigadeiro_5"
    paste(regmatches(formula, gregexpr("variable_[0-9]", formula))[[1]],
          collapse = ", ")
    

    如果您希望代码看起来更简洁,也可以使用 stringr 包:

    library(stringr)
    str_extract_all(formula, "[a-z]*_[0-9]*")
    

    【讨论】:

    • 谢谢@Brigadeiro。很抱歉错过了这个:公式也可以在运算中包含一个数字,例如 ```formula
    【解决方案2】:

    您可以将strsplit() 与一些附加功能一起使用。

    res <- trimws(el(strsplit(formula, "\\+|\\-|\\*|\\/")))
    

    之后我们希望这些元素在我们尝试强制它们时产生NA as.numeric()

    res[is.na(suppressWarnings(as.numeric(res)))]
    # [1] "variable_1" "variable_2" "variable_3" "variable_4" "variable_5"
    

    数据

    formula <- 'variable_1+variable_2*variable_3-variable_4/variable_5 + 456'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 2022-01-11
      相关资源
      最近更新 更多