8

私はの線に沿って何かを持っています

y ~ x + z

そして、私はそれをに変換したいと思います

y ~ x_part1 + x_part2 + z

より一般的には、数式を受け取り、「^x$」に一致するすべての用語を「x_part1」と「x_part2」に置き換えてその数式を返す関数が必要です。これが私の現在の解決策ですが、とても面倒に感じます...

my.formula <- fruit ~ apple + banana
var.to.replace <- 'apple'
my.terms <- labels(terms(my.formula))
new.terms <- paste0('(', 
                    paste0(var.to.replace, 
                           c('_part1', '_part2'),
                           collapse = '+'),
                    ')')
new.formula <- reformulate(termlabels = gsub(pattern = var.to.replace,
                                             replacement = new.terms,
                                             x = my.terms),                                 
                           response = my.formula[[2]])

追加の警告は、入力式が相互作用で指定される可能性があることです。

y ~ b*x + z

これらの(同等の)式のいずれかを出力する必要があります

y ~ b*(x_part1 + x_part2) + z
y ~ b + (x_part1 + x_part2) + b:(x_part1 + x_part2) + z
y ~ b + x_part1 + x_part2 + b:x_part1 + b:x_part2 + z

MrFlick は、

代替(y〜b * x + z、リスト(x =引用(x_part1 + x_part2)))

しかし、次のように変数に変更したい数式を保存したら、

my.formula <- fruit ~ x + banana

このアプローチには、もう少しマッサージが必要なようです。

substitute(my.formula, list(x=quote(apple_part1 + apple_part2)))
# my.formula

そのアプローチに必要な変更は次のとおりです。

do.call(what = 'substitute',
        args = list(apple, list(x=quote(x_part1 + x_part2))))

しかし、 'x' と c('x_part', 'x_part2') の両方が名前付きの変数に格納されている場合、このアプローチを使用する方法がわかりませvar.to.replacenew.terms

4

5 に答える 5

2

主効果のみを変更したい場合は、x を減算し、2 つの新しい変数を追加できます。

> f <- y ~ x + z
> update(f, .~.-x+x_part1 + x_part2)
y ~ z + x_part1 + x_part2
于 2016-08-09T16:25:31.550 に答える
0

の要求に応じてrcorty、「x」と c('x_part', 'x_part2') をvar.to.replaceそれぞれnew.termsと に格納し、MrFlickを使用するという の提案を使用するsetNamesと、おそらく次のことができます。

my.formula <- fruit ~ x + banana
var.to.replace <- "x"
new.terms <-  c('x_part', 'x_part2') 
new.terms1 <- paste(new.terms, collapse="+")
do.call("substitute", list(my.formula, setNames(list(str2lang(new.terms1)), var.to.replace))) 

> fruit ~ x_part + x_part2 + banana

余談ですが、Paul Johnson のRchaeology (セクション 2.1) は関連性があり、教育的で、面白いものでした。

于 2021-12-23T02:16:51.777 に答える