2017-08-21 9 views
0

私はデータフレームまたはdata.tableを持つR.セイにおける建物の機能を習得しようとしていますを使用してRでの名前のオブジェクトに関数を作成する、既存の文字ベクトル

dummy <- df(y, x, a, b, who) 

どこのようなものです「」ベクターso、

who <- c("Joseph", "Kim", "Billy") 

文字ベクトルを使用してさまざまな回帰モデルを実行し、出力とその要約統計情報の名前を付けたいと思います。

function() { 
ols.reg.Billy <- lm(y ~ x + a + b, data = dummy[dummy$who == "Billy"]) 
dw.Billy <- dwtest(ols.reg.Billy) 

output.Billy <- list(ols.reg.Billy, dw.Billy) 
return(output.Billy) 
} 

しかし、上記のベクター人の500の異なるエントリについて:だからエントリ上記のベクターでは、「ビリー」のために、私はこのような何かをしたいと思います。

これを実行する方法はありますか?最も効率的な方法は何ですか?私は間違いを続け、私は真剣に何かを見逃していると感じています。ペーストを使用する方法はありますか?

+0

を多分 'lapply'? –

+1

個々の変数ではなく、リストを使用します。カスタム名前付き変数ではなく名前付きリストを使用する理由については、[データフレームのリストを作成する方法](https://stackoverflow.com/a/24376207/903061)を参照してください。 – Gregor

+0

[mcve]を確認してください。 –

答えて

3

これで解決できない場合は、reproducible exampleを入力してください。それはより簡単にあなたを助けることができます。 CO2データに建てを使用して

library(lmtest) 
    outputs <- lapply(who, function(name) { 
     ols.reg <- lm(y ~ x + a + b, data = dummy[dummy$who == name]) 
     dw <- dwtest(ols.reg) 
     output <- paste(c("ols.reg","dw"), name, sep = "_") 
     return(output) 
    }) 
+0

私はこのソリューションが大好きですが直感的です。リストの2つの要素(ols.reg、dw)を「who」の各値に基づいて名前を付ける場合はどうなりますか? – jvalenti

+1

現在の「who」値を返す前に、その名前でリストに名前を追加できます。私は解決策を更新しました。 – csgroen

2

1)地図私たちはそれぞれのタイプごとに個別の濃上の取り込みを退行したいと仮定し設定。これは、タイプによってコンポーネントに名前を付けることに注意してください。

Map(function(x) lm(uptake ~ conc, CO2, subset = Type == x), levels(CO2$Type)) 

この2つのコンポーネントリスト(ケベック州とミシサガ州の各レベルに1つのコンポーネント)を指定すると、出力後も続けられます。

$Quebec 

Call: 
lm(formula = uptake ~ conc, data = CO2, subset = Type == x) 

Coefficients: 
(Intercept)   conc 
    23.50304  0.02308 


$Mississippi 

Call: 
lm(formula = uptake ~ conc, data = CO2, subset = Type == x) 

Coefficients: 
(Intercept)   conc 
    15.49754  0.

2)地図/ do.call我々だけでなく、タイプを使用してコンポーネントに名前を付けるだけでなく、通話中の実際の型と置換のxを持つことを望む可能性があります出力のライン。その場合は、do.callを使用してlmを呼び出し、quoteを使用して、その値ではなくデータフレームの名前が表示され、bquoteを使用してxの置換を実行します。

与える
reg <- function(x) { 
    do.call("lm", list(uptake ~ conc, quote(CO2), subset = bquote(Type == .(x)))) 
} 
Map(reg, levels(CO2$Type)) 

$Quebec 

Call: 
lm(formula = uptake ~ conc, data = CO2, subset = Type == "Quebec") 

Coefficients: 
(Intercept)   conc 
    23.50304  0.02308 


$Mississippi 

Call: 
lm(formula = uptake ~ conc, data = CO2, subset = Type == "Mississippi") 

Coefficients: 
(Intercept)   conc 
    15.49754  0.

3)lmListはnlmeパッケージは、これを行うためにlmListがあります

library(nlme) 
lmList(uptake ~ conc | Type, CO2, pool = FALSE) 

寄付:

Call: 
    Model: uptake ~ conc | Type 
    Data: CO2 

Coefficients: 
      (Intercept)  conc 
Quebec   23.50304 0.02308005 
Mississippi 15.49754 0.
関連する問題