获取R公式的右侧变量

21

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

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

使用 model.frame(f,iris) 函数,可以得到公式中的所有变量子集。如何自动保留公式右侧的变量(在本例中为 Petal.LengthPetal.Width)?


1
model.frame(f,iris)[, -1]? - lukeA
1
这里不需要使用as.formula函数。Species~Petal.Length + Petal.Width已经是一个合法的公式了。 - Richie Cotton
5个回答

40

你需要标签术语,请查看?labels?terms?terms.object

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

具体来说,labels.terms 返回一个 terms 对象的 "term.labels" 属性,该属性不包括 LHS 变量。


20
如果您的公式中有一个函数,例如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
@jay.sf 这是 get_all_vars 的预期行为。 - Sven Hohenstein
当然,这是一个我之前不知道的很好的命令。我只是想给那些期望交互项也像其他解决方案中的 labels(terms(mpg ~ hp * cyl)) 那样出现的人(比如我)提供一点小提示。 - jay.sf

9

一种方法是使用子集来从公式中删除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
...

1
我喜欢这个答案,因为它消除了依赖部分,无论其中有多少项。formula(a + b ~ c +d)[-2] - Roman Luštrik

7

软件包formula.tools有许多函数可使使用公式更加便捷。在您的情况下:

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

依赖于基本的R语言可能是危险的,因为左侧可能会缺失,这意味着元素1不再引用原来的内容。

1

您可以使用rlang包中的f_rhs函数来提取公式的右侧,并将其与all.vars组合使用。

> f <- Species ~ Petal.Length + Petal.Width
> 
> # RHS
> rlang::f_rhs(f)
Petal.Length + Petal.Width
> all.vars(rlang::f_rhs(f))
[1] "Petal.Length" "Petal.Width" 
> 
> # LHS
> rlang::f_lhs(f)
Species
> all.vars(rlang::f_lhs(f))
[1] "Species"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接