2017-06-21 7 views
0

を評価しない。mydf <- data.frame(college=c(1,2,1,0,3))機能によりID10Tエラーを簡単にするため

> str(mydf) 
'data.frame': 5 obs. of 1 variable: 
$ college: num 1 2 1 0 3 

私が最初の因数分解によって順序ロジスティック回帰をconducteように設定繰り返さコード要素の束を有し、以下のような基準レベルを設定します:

> mydf$college <- factor(mydf$college) 
> relevel(mydf$college, ref="2") 
[1] 1 2 1 0 3 
Levels: 2 0 1 3 
> str(mydf$college) 
Factor w/ 4 levels "0","1","2","3": 2 3 2 1 4 

私はので、私はそれを呼び出すと、より良いプログラミング作法を持っている可能性があり、これを行うための関数を書いた:

factor_level <- function(ds, var, referent){ 
    ds[[var]] <- factor(ds[[var]]) 
    ds[[var]] <- relevel(ds[[var]], ref=referent) 
} 

しかし、関数を呼び出すとエラーは発生しませんが、因数分解された結果も得られません。

> factor_level(ds = mydf, var="college", referent= "2") 
> str(mydf$college) 
num [1:5] 1 2 1 0 3 

私はそれが構文だと確信していますが、私はその理由を理解できませんでした。前もって感謝します。

+4

物事を行うことができ、データフレーム内の複数のベクトルにこのように適用し、正しくあなたのコメントに質問を理解していればあなたがしてはいけない特別なもの)。あなたの関数は変更された因子 'ds'を返す必要があり、あなたが関数を呼び出すときに結果を代入します。 – joran

答えて

1

、あなたの関数が

factor_level <- function(var, referent){ 
    var <- factor(var) 
    relevel(var, ref=referent) 
} 

あるべき次に、あなたが呼び出すことができます。

mydf$college <- factor_level(mydf$college, "2") 

を私はあなたが別のを利用して何を得るとは思いませんデータおよび変数名の引数を指定します。ベクトルに渡すだけです。

私はあなたがいない限り(あなたは関数の外は何も変更しない関数の内部で行う

mydf [c ("var1", "var2", ..., "varn")] <- 
    lapply(mydf [c ("var1", "var2", ..., "varn")], 
      factor_level, "2") 
+0

ありがとうございます。私は少し混乱していた。これは2つの適用ステートメントのより良い場所ですか?同じ参照方法で同じ方法を変更したい名前のベクトルから作成されたインデックスの列をサブセット化するだけですか? – akaDrHouse

+0

私の答えに追加を見てください。私はあなたの質問を正しく理解してくれることを願っています。 – Benjamin

+0

ああ、私の機能をすべて一緒にスキップして、次のようなことをやっているように思っていました: 'mydf [c(" var1 "、" var2 ")、] < - apply(mydf [c(" var1 " (mydf [c( "var1"、 "var2")、]、2)を指定します。 、function(x)relevel(x、ref = "2")) 'しかし、私はそれを動作させることができませんでした。 – akaDrHouse

1

問題は、R関数は元の入力を変更するような振る舞いをする置換関数を除き、元の入力を変更しないことです。

factor_level <- function(ds, var, referent){ 
    ds[[var]] <- factor(ds[[var]]) 
    ds[[var]] <- relevel(ds[[var]], ref=referent) 
    ds 
} 

mydf <- factor_level(ds = mydf, var="college", referent= "2") 

か、このように(Rのように<-または[<-)交換用の関数を定義する必要があります:

`factor_level<-` <- function(ds, var, value){ 
    ds[[var]] <- factor(ds[[var]]) 
    ds[[var]] <- relevel(ds[[var]], ref=value) 
    ds 
} 

factor_level(mydf, var="college") <- "2" 

をしかし、置換機能が、この場合には、非常に奇妙な振る舞いだから、これを実行する必要があります、私はあなたがそれを使用すべきではないと思います。彼のコメントに何を意味するのかjoran説明するために

関連する問題