我正在写我的第一个S3类和相关的方法,我想知道如何子集化我的输入数据集,以便只保留公式中指定的变量?
data(iris) f <- Species~Petal.Length + Petal.Width
使用model.frame(f,iris),我得到了公式中所有变量的子集。如何自动只保留右边的变量(在例子Petal.Length和Petal.Width中)?
model.frame(f,iris)
Petal.Length
Petal.Width
2j4z5cfb1#
你想要labels和terms;参见?labels、?terms和?terms.object。
labels
terms
?labels
?terms
?terms.object
labels(terms(f)) # [1] "Petal.Length" "Petal.Width"
具体来说,labels.terms返回terms对象的"term.labels"属性,该属性不包括LHS变量。
labels.terms
"term.labels"
bpsygsoo2#
如果公式中包含函数(例如log),并希望根据变量对数据框进行子集化,则可以使用get_all_vars。这将忽略该函数并提取未转换的变量:
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
all.vars(f2[-2]) [1] "Petal.Length" "Petal.Width"
[-2]用于排除左手。
[-2]
lmvvr0a83#
一种方法是使用子集从公式中删除LHS,然后可以使用model.frame:
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 ...
wfsdck304#
软件包formula.tools提供了许多函数,可以简化公式的使用。
> formula.tools::rhs.vars(f) [1] "Petal.Length" "Petal.Width"
依赖于基数R可能是危险的,因为左手边可能丢失,这意味着元素1不再引用它。
xesrikrc5#
您可以使用rlang包中的f_rhs函数提取公式的右侧并将其与all.vars组合
rlang
f_rhs
> 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"
5条答案
按热度按时间2j4z5cfb1#
你想要
labels
和terms
;参见?labels
、?terms
和?terms.object
。具体来说,
labels.terms
返回terms
对象的"term.labels"
属性,该属性不包括LHS变量。bpsygsoo2#
如果公式中包含函数(例如
log
),并希望根据变量对数据框进行子集化,则可以使用get_all_vars
。这将忽略该函数并提取未转换的变量:如果你只想知道变量名,
all.vars
是一个非常有用的函数:[-2]
用于排除左手。lmvvr0a83#
一种方法是使用子集从公式中删除LHS,然后可以使用
model.frame
:wfsdck304#
软件包formula.tools提供了许多函数,可以简化公式的使用。
依赖于基数R可能是危险的,因为左手边可能丢失,这意味着元素1不再引用它。
xesrikrc5#
您可以使用
rlang
包中的f_rhs
函数提取公式的右侧并将其与all.vars
组合