2016-07-03 7 views
1

私はnオブジェクトの式が欲しいので、関数で使う必要があります。この目的のために、私はモデル式から変数名と値を抽出する方法は?

e <- new.env() 
e$y <- matrix(rnorm(20), ncol = 4) 
e$x1 <- 2*matrix(rnorm(20), ncol = 4) 
e$x2 <- 2*matrix(rnorm(20), ncol = 4) 
e$x3 <- 2*matrix(rnorm(20), ncol = 4) 

f = formula(y~x1+x2+x3, env = e) 
test <- function(formula){ 
    #A any function using the variables y, x1, x2 and x3 
} 
+0

変数 'y'、' x1'、 'x2'、' x3'には名前だけがありません。 –

答えて

2

、例えば、この式のオブジェクトにアクセスする必要が現時点では適切な環境

に数式を入れて、あなたの式fは、地球環境にまだある:

f <- formula(y~x1+x2+x3, env = e) 
environment(f) 
# <environment: R_GlobalEnv> 

は容易に式であるため、引数はここでは無効です。あなたが?formulaを読めば:

env: the environment to associate with the result, if not already 
     a formula. 

だから、あなたが正しいものにfの環境を変更するために一歩を取る必要があります。

environment(f) <- e 

また、なぜ代わりにas.formulaを使用していませんか?

f <- as.formula("y~x1+x2+x3",env=e) 
# y ~ x1 + x2 + x3 
# <environment: 0xa1bb67c> 

方法1:( "用語" のデータフレームの属性を、より多くのための?model.frame?terms.objectを参照してください)あなたがモデルのフレームを取得model.frame.default()

z <- model.frame.default(f) 

str(z) 
# 'data.frame': 5 obs. of 4 variables: 
# $ y : num [1:5, 1:4] 0.601 -1.295 -0.312 0.247 -1.545 ... 
# $ x1: num [1:5, 1:4] 1.801 2.177 -1.68 -0.769 -2.371 ... 
# $ x2: num [1:5, 1:4] -2.407 -0.719 2.588 0.431 -0.787 ... 
# $ x3: num [1:5, 1:4] -3.677 -0.638 -1.325 -2.901 -1.013 ... 
# - attr(*, "terms")=Classes 'terms', 'formula' language y ~ x1 + x2 + x3 
# .. ..- attr(*, "variables")= language list(y, x1, x2, x3) 
# .. ..- attr(*, "factors")= int [1:4, 1:3] 0 1 0 0 0 0 1 0 0 0 ... 
# .. .. ..- attr(*, "dimnames")=List of 2 
# .. .. .. ..$ : chr [1:4] "y" "x1" "x2" "x3" 
# .. .. .. ..$ : chr [1:3] "x1" "x2" "x3" 
# .. ..- attr(*, "term.labels")= chr [1:3] "x1" "x2" "x3" 
# .. ..- attr(*, "order")= int [1:3] 1 1 1 
# .. ..- attr(*, "intercept")= int 1 
# .. ..- attr(*, "response")= int 1 
# .. ..- attr(*, ".Environment")=<environment: R_GlobalEnv> 
# .. ..- attr(*, "predvars")= language list(y, x1, x2, x3) 
# .. ..- attr(*, "dataClasses")= Named chr [1:4] "nmatrix.4" "nmatrix.4" "nmatrix.4" "nmatrix.4" 
# .. .. ..- attr(*, "names")= chr [1:4] "y" "x1" "x2" "x3" 

を使用することができます、データフレームとして使用します。


方法2:またall.varsgetの組み合わせを使用することができterms.formulaall.vars

を使用しています。例:

list_call <- attr(terms.formula(f), "variables") 
# list(y, x1, x2, x3) 
z <- setNames(eval(list_call, envir = environment(f)), all.vars(f)) 

str(z) 
# List of 4 
# $ y : num [1:5, 1:4] -0.107 -0.32 0.452 -0.427 0.184 ... 
# $ x1: num [1:5, 1:4] -2.254 0.674 3.754 -1.2 0.734 ... 
# $ x2: num [1:5, 1:4] 0.15 1.28 0.15 4.26 2.74 ... 
# $ x3: num [1:5, 1:4] -1.505 -0.25 -0.462 3.136 1.282 ... 

これで一覧が表示されます。


方法3:get_all_vars()(注意:!注意して使用します)原則として

、これはあなたのための最善の解決策ではなく、必要があります。

z <- get_all_vars(f) 

str(z) 
# 'data.frame': 5 obs. of 16 variables: 
# $ y : num -0.107 -0.32 0.452 -0.427 0.184 
# $ x1: num -0.762 0.779 -1.139 0.506 -0.483 
# $ x2: num 0.9873 0.2398 0.5705 0.1761 0.0348 
# $ x3: num 0.287 0.625 0.235 -1.243 -0.146 
# $ NA: num -2.254 0.674 3.754 -1.2 0.734 
# $ NA: num 0.258 -0.242 -2.28 0.375 6.105 
# $ NA: num 1.483 0.345 0.547 -1.084 -0.813 
# $ NA: num -2.523 -0.642 -0.403 0.706 1.26 
# $ NA: num 0.15 1.28 0.15 4.26 2.74 
# $ NA: num 0.868 -0.572 0.751 -0.731 -1.912 
# $ NA: num -0.0673 -0.275 1.0924 1.8836 0.633 
# $ NA: num 0.074 -2.958 -1.564 -1.418 2.05 
# $ NA: num -1.505 -0.25 -0.462 3.136 1.282 
# $ NA: num -1.45 1.96 1.27 1.21 -1.04 
# $ NA: num -0.869 2.991 1.268 -1.601 -0.581 
# $ NA: num -3.286 0.753 -2.75 3.347 -2.161 

これはデータフレームを提供します。しかし、あなたは気づいたはずですが、あなたは4つではなく16の変数を持つデータフレームになります。あなたの数式の変数のどれかが行列であるとき、get_all_vars()は正しく動作しません。。しかし、この方法は、行列変数がないときに最も便利な方法ですので、このオプションも念頭に置いてください。

関連する問題