我正在编写我的第一个S3类和相关方法,我想知道如何对输入数据集进行子集化,以便只保留公式中指定的变量?
data(iris)
f <- Species~Petal.Length + Petal.Width
使用model.frame(f,iris)
,我得到了公式中所有变量的子集。如何自动保留右侧变量(在示例Petal.Length
和Petal.Width
中)?
答案 0 :(得分:22)
您想要labels
和terms
;请参阅?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不再引用它。