获取R公式的右侧变量

ctzwtxfj  于 2023-01-15  发布在  其他
关注(0)|答案(5)|浏览(151)

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

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

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

2j4z5cfb

2j4z5cfb1#

你想要labelsterms;参见?labels?terms?terms.object

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

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

bpsygsoo

bpsygsoo2#

如果公式中包含函数(例如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]用于排除左手。

lmvvr0a8

lmvvr0a83#

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

wfsdck304#

软件包formula.tools提供了许多函数,可以简化公式的使用。

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

依赖于基数R可能是危险的,因为左手边可能丢失,这意味着元素1不再引用它。

xesrikrc

xesrikrc5#

您可以使用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"

相关问题