【问题标题】:Get the right hand side variables of an R formula获取 R 公式的右侧变量
【发布时间】:2014-02-15 07:50:36
【问题描述】:

我正在编写我的第一个 S3 类和相关方法,我想知道如何对我的输入数据集进行子集化以便只保留公式中指定的变量?

data(iris)
f <- Species~Petal.Length + Petal.Width

使用model.frame(f,iris),我得到了一个包含公式中所有变量的子集。如何仅自动保留右侧变量(在示例中为 Petal.LengthPetal.Width)?

【问题讨论】:

  • model.frame(f,iris)[, -1]?
  • 这里不需要as.formulaSpecies~Petal.Length + Petal.Width 已经是一个公式了。

标签: r class formula


【解决方案1】:

你想要labelsterms;请参阅?labels?terms?terms.object

labels(terms(f))
# [1] "Petal.Length" "Petal.Width" 

特别是,labels.terms 返回 terms 对象的 "term.labels" 属性,其中不包括 LHS 变量。

【讨论】:

    【解决方案2】:

    如果您的公式中有一个函数,例如log,并且想要根据变量对数据框进行子集化,您可以使用get_all_vars。这将忽略函数并提取未转换的变量:

    f2 <- Species ~ log(Petal.Length) + Petal.Width
    
    get_all_vars(f2[-2], iris)
    
        Petal.Length Petal.Width
    1            1.4         0.2
    2            1.4         0.2
    3            1.3         0.2
    4            1.5         0.2
    ...
    

    如果你只想要变量名,all.vars 是一个非常有用的函数:

    all.vars(f2[-2])
    
    [1] "Petal.Length" "Petal.Width" 
    

    [-2] 用于排除左侧。

    【讨论】:

    • 这不会考虑交互,例如get_all_vars(mpg ~ hp * cyl, mtcars).
    • @jay.sf 这是get_all_vars 的预期行为。
    • 当然,我以前不知道的很棒的命令,我只是想给那些期望交互术语也显示为例如在 labels(terms(mpg ~ hp * cyl)) 中来自另一个解决方案。
    【解决方案3】:

    一种方法是使用子集从公式中删除 LHS。然后您可以在此使用model.frame

    f[-2]
    ~Petal.Length + Petal.Width
    
    model.frame(f[-2],iris)
        Petal.Length Petal.Width
    1            1.4         0.2
    2            1.4         0.2
    3            1.3         0.2
    4            1.5         0.2
    5            1.4         0.2
    6            1.7         0.4
    ...
    

    【讨论】:

    • 我喜欢这个答案,因为它删除了依赖部分,无论其中的术语数量如何。 formula(a + b ~ c +d)[-2]
    【解决方案4】:

    formula.tools 包具有许多功能,可让您更轻松地使用公式。在你的情况下:

    > formula.tools::rhs.vars(f)
    [1] "Petal.Length" "Petal.Width"
    

    依赖基数 R 可能很危险,因为左侧可能会丢失,这意味着元素 1 不再引用它。

    【讨论】:

      猜你喜欢
      • 2021-12-06
      • 1970-01-01
      • 2020-04-28
      • 1970-01-01
      • 2017-09-16
      • 2014-02-14
      • 1970-01-01
      • 2011-03-27
      相关资源
      最近更新 更多