2016-03-06 49 views
4

我可以構建一個公式,做什麼,我希望開始在公式中的術語的字符版本,但我用一個公式對象開始結結巴巴:如何包裝一個公式的RHS方面具有功能

form1 <- Y ~ A + B 
form1[-c(1,2)][[1]] 
#A + B 

現在如何建立一個公式對象,看起來像:

Y ~ poly(A, 2) + poly(B, 2) + poly(C, 2) 

或者:

Y ~ pspline(A, 4) + pspline(B, 4) + pspline(C, 4) 

似乎它可能涉及沿RHS遞歸散步,但我沒有取得進展。它只是發生在我身上,我可能會使用

> attr(terms(form1), "term.labels") 
[1] "A" "B" 

然後使用as.formula(字符表達式)方法,但我社sorly的喜歡看的lapply (RHS_form, somefunc)版本polyize(或者polymer?)功能。

回答

4

如果我借用一些我最初寫過here的函數,你可以做這樣的事情。首先,輔助功能......

extract_rhs_symbols <- function(x) { 
    as.list(attr(delete.response(terms(x)), "variables"))[-1] 
} 
symbols_to_formula <- function(x) { 
    as.call(list(quote(`~`), x))  
} 
sum_symbols <- function(...) { 
    Reduce(function(a,b) bquote(.(a)+.(b)), do.call(`c`, list(...), quote=T)) 
} 
transform_terms <- function(x, f) { 
    symbols_to_formula(sum_symbols(sapply(extract_rhs_symbols(x), function(x) do.call("substitute",list(f, list(x=x)))))) 
} 

然後你就可以使用

update(form1, transform_terms(form1, quote(poly(x, 2)))) 
# Y ~ poly(A, 2) + poly(B, 2) 

update(form1, transform_terms(form1, quote(pspline(x, 4)))) 
# Y ~ pspline(A, 4) + pspline(B, 4) 
+0

我特別喜歡這個,因爲它也可以用來自動改裝模型。 –

4

有一個formula.tools包,它使用公式提供了多種實用功能。

f <- y ~ a + b 
rhs(f)      # a + b 
x <- get.vars(rhs(f))   # "a" "b" 
r <- paste(sprintf("poly(%s, 4)", x), collapse=" + ") # "poly(a, 4) + poly(b, 4)" 
rhs(f) <- parse(text=r)[[1]] 
f        # y ~ poly(a, 4) + poly(b, 4) 
+0

+1。欣賞指向包的指針。儘管如此,文本操作卻是我試圖避免的。 –

相關問題