reformulate
あなたが望むことをします。
reformulate(termlabels = c('x','z'), response = 'y')
## y ~ x + z
またはインターセプトなし
reformulate(termlabels = c('x','z'), response = 'y', intercept = FALSE)
## y ~ x + z - 1
reponses
次のような複数の式を作成することはできないことに注意してください。x+y ~z+b
reformulate(termlabels = c('x','y'), response = c('z','b'))
z ~ x + y
既存の用語から用語を抽出するにはformula
(例を指定して)
attr(terms(RHS), 'term.labels')
## [1] "a" "b"
応答を取得する方法は少し異なります。単純なアプローチです(単一の変数応答の場合)。
as.character(LHS)[2]
## [1] 'y'
combine_formula <- function(LHS, RHS){
.terms <- lapply(RHS, terms)
new_terms <- unique(unlist(lapply(.terms, attr, which = 'term.labels')))
response <- as.character(LHS)[2]
reformulate(new_terms, response)
}
combine_formula(LHS, list(RHS, RHS2))
## y ~ a + b + c
## <environment: 0x577fb908>
応答を文字ベクトルとして指定する方が賢明だと思います。
combine_formula2 <- function(response, RHS, intercept = TRUE){
.terms <- lapply(RHS, terms)
new_terms <- unique(unlist(lapply(.terms, attr, which = 'term.labels')))
response <- as.character(LHS)[2]
reformulate(new_terms, response, intercept)
}
combine_formula2('y', list(RHS, RHS2))
数式を操作する演算子を定義することもできます+
(数式オブジェクトの新しいメソッドの設定を更新します)
`+.formula` <- function(e1,e2){
.terms <- lapply(c(e1,e2), terms)
reformulate(unique(unlist(lapply(.terms, attr, which = 'term.labels'))))
}
RHS + RHS2
## ~a + b + c
update.formula
使い勝手も.
良いです
update(~a+b, y ~ .)
## y~a+b