获取R公式的右侧变量

时间:2014-01-24 10:46:38

标签: r class formula

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

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

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

4 个答案:

答案 0 :(得分:22)

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

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

特别是,labels.terms会返回"term.labels"对象的terms属性,该属性会排除LHS变量。

答案 1 :(得分:13)

如果公式中有函数,例如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]用于排除左侧。

答案 2 :(得分:8)

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

答案 3 :(得分:3)

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

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

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