【问题标题】:Character extraction in R?R中的字符提取?
【发布时间】:2017-04-24 18:36:48
【问题描述】:

如何从 R 中的以下公式中提取“mpg”?我知道先将公式转换为字符然后使用某种正则表达式会很有用。但我不知道是哪一个。

mpg ~ x1 + x2

【问题讨论】:

    标签: r


    【解决方案1】:

    我们可以使用all.vars

    all.vars(form)[1]
    #[1] "mpg"
    

    terms

    as.character(attr(terms(form), "variables")[[2]])
    #[1] "mpg"
    

    或者另一种选择是

    paste(form)[[2]]
    #[1] "mpg"
    

    在哪里

    form <-  mpg ~ x1 + x2
    

    【讨论】:

    • 如果你在做as.characteras.character(form)[2]怎么样
    【解决方案2】:

    所有给出的答案都适用于您的特定用例。但是,如果您希望在更广泛的意义上使用它,则需要注意一些警告。为了讨论这些,我们将定义一些公式

    fm <- mpg ~ x1 + x2
    fm_one <- ~ x1 + x2
    fm_multi <- mpg + y1 ~ x1 + x2
    

    all.vars 将返回公式中所有变量的字符向量。这是目前给出的选项中最快的。但是,它区分等式左侧和右侧的变量。这是否可以接受取决于您的用例。

    all.vars(fm)[1]         # "mpg"
    all.vars(fm_one)[1]     # "x1" (this is a right hand side variable)
    all.vars(fm_multi)[1]   # "mpg"  (missing other left hand side variables)
    

    terms 方法 (as.character(attr(terms(fm), "variables"))) 将生成类似的向量,但变量名称从第二个位置开始(list 调用占用第一个元素)。它具有与all.vars 方法相同的缺点。

    as.character(attr(terms(fm), "variables"))[2]        # "mpg"
    as.character(attr(terms(fm_one), "variables"))[2]    # "x1"
    as.character(attr(terms(fm_multi), "variables"))[2]  # "mpg"
    

    使用as.character 会生成长度为3 或2 的字符向量,具体取决于是否存在左侧。这至少有能力返回整个左侧,但它不会返回响应变量的字符向量。但是,它仍然存在无法区分左侧变量和右侧变量的缺点。

    as.character(fm)        # "~" "mpg" "x1" "x2"
    as.character(fm_one)    # "~" "x1" "x2"
    as.character(fm_multi)  # "~" "mpg" "y1" "x1" "x2"
    

    deparse 方法比all.vars 慢一些(但仍以纳秒为单位),并且具有区分左侧和右侧的主要优点。

    gsub(" ","",gsub("~.*", "", deparse(fm)))        # "mpg"
    gsub(" ","",gsub("~.*", "", deparse(fm_one)))    # ""
    gsub(" ","",gsub("~.*", "", deparse(fm_multi)))  # "mpg+y1"
    

    根据您的实际需要,您可能不需要保护单边或多变量公式。如果您在一个已知所有公式都是单变量和双面的系统中工作,all.vars 可能是您最好的选择。如果你不能确定,我建议使用deparse 方法。这至少可以确保您在查找响应变量时始终获得响应变量。

    【讨论】:

      【解决方案3】:

      这是一种使用正则表达式的方法

      x = mpg ~ x1 + x2
      gsub(" ","",gsub("~.*", "", deparse(x)))
      #[1] "mpg"
      

      【讨论】:

      • 我认为Reduce 调用可能是多余的。据我所知,这同样适用于仅使用gsub(" ","",sub("~.*", "", deparse(x)))
      【解决方案4】:

      给定公式:

      frm <- as.formula(mpg ~ x1 + x2)
      

      可以简单地使用以下方法提取左侧的术语:

      as.character(frm[[2]])
      [1] "mpg"
      

      【讨论】:

        猜你喜欢
        • 2022-07-01
        • 2014-02-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-03
        • 1970-01-01
        • 1970-01-01
        • 2015-09-04
        相关资源
        最近更新 更多