我正在编写我的第一个S3类及其方法,想知道如何对输入数据集进行子集化,以仅保留公式中指定的变量?
data(iris)
f <- Species~Petal.Length + Petal.Width
使用 model.frame(f,iris)
函数,可以得到公式中的所有变量子集。如何自动保留公式右侧的变量(在本例中为 Petal.Length
和 Petal.Width
)?
你需要标签
和术语
,请查看?labels
、?terms
和?terms.object
。
labels(terms(f))
# [1] "Petal.Length" "Petal.Width"
具体来说,labels.terms
返回一个 terms
对象的 "term.labels"
属性,该属性不包括 LHS 变量。
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.sfget_all_vars
的预期行为。 - Sven Hohensteinlabels(terms(mpg ~ hp * cyl))
那样出现的人(比如我)提供一点小提示。 - jay.sf一种方法是使用子集来从公式中删除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]
- Roman Luštrik软件包formula.tools有许多函数可使使用公式更加便捷。在您的情况下:
> formula.tools::rhs.vars(f)
[1] "Petal.Length" "Petal.Width"
您可以使用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"
model.frame(f,iris)[, -1]
? - lukeAas.formula
函数。Species~Petal.Length + Petal.Width
已经是一个合法的公式了。 - Richie Cotton