2016-04-08 8 views
0

指定したデータセットに対してage10、age20、age30などの変数を作成したいと考えています。 add_ages関数の入力はdfという名前のデータフレームであり、新しい変数は既存の変数ageとの関係に基づいて作成されます。私は上記のコードを実行したときにループ内で新しい列を作成する

df <- data.frame(age=sample(1:100,10,replace=T)) 

add_ages <- function(d){ 
    for(i in seq(10,100,10)){ 
    d[,paste0("age",i)] <<- ifelse(i>=d[,"age"] & d[,"age"]<i+10,1,0) 
    } 
} 

add_ages(d=df) 

はしかし、私は次のエラーを取得する:

Error in d[, paste0("age", i)] <<- ifelse(i >= d[, "age"] & d[, "age"] < : 
    object 'd' not found 

私はdが見つからない、なぜ私はそれがDFであることを定義していたとき、私は、理解していません。何かご意見は?

答えて

2

データを使用してダミー変数を作成しようとしているようです。

Rのほとんどのモデリング関数では、モデリングのステップで自動的に行われることに注意してください。これが動作する方法は、model.matrix()関数を使用することです。

ここ

は一例です:

DF < - data.frame(年齢=サンプル(1:100,10、= Tを交換))

# Create a categorical variable using cut() 
df$agegroup <- cut(df$age, breaks=seq(0, 100, by = 10)) 

あなたは今の年齢とカテゴリ変数を持っていますグループ:

head(df) 
    age agegroup 
1 82 (80,90] 
2 79 (70,80] 
3 99 (90,100] 
4 12 (10,20] 
5 82 (80,90] 
6 66 (60,70] 

モデル行列に

# Create the model matrix 

model.matrix(~agegroup - 1, df) 
    agegroup(0,10] agegroup(10,20] agegroup(20,30] agegroup(30,40] agegroup(40,50] 
1    0    0    0    0    0 
2    0    0    0    0    0 
3    0    0    0    0    0 
4    0    1    0    0    0 
5    0    0    0    0    0 
6    0    0    0    0    0 
7    0    0    0    0    0 
8    0    1    0    0    0 
9    0    0    0    0    1 
10    0    0    0    0    0 
を変換します
2

<<-の代わりに<-を使用してください。 <<-を使用している場合は、グローバルスコープ内に物事が割り当てられます。dは存在しません。最後に、dを返します。

add_ages <- function(d) { 
    for (i in seq(10,100,10)){ 
    d[,paste0("age",i)] <- ifelse(i>=d[,"age"] & d[,"age"]<i+10,1,0) 
    } 
    d 
} 
df <- add_ages(df) 

編集:

あなたが本当にdf <- add_ages(df)をやって回避したい場合、あなたは次のことを行うことができます:

add_ages <- function() { 
    for (i in seq(10,100,10)){ 
    df[,paste0("age",i)] <<- ifelse(i>=df[,"age"] & df[,"age"]<i+10,1,0) 
    } 
} 

add_ages() 

私は、少なくとも2つの理由から、この反対お勧めします。まず、これはまったく一般化しません。これを行う関数を作成することにはまったく意味がありません。dfの作成直後にループを使用するほうがよいでしょう。

df <- data.frame(age=sample(1:100,10,replace=T)) 
for (i in seq(10,100,10)){ 
    df[,paste0("age",i)] <<- ifelse(i>=df[,"age"] & df[,"age"]<i+10,1,0) 
} 

第2に、機能は副作用を避けるために努力する必要があります。言い換えれば、関数を呼び出すと、変更されたオブジェクトだけが出力を保存する場所になります。このような副作用は無害に見えるかもしれませんが、コードの途中でいくつかの関数の1つとして記述してから6か月後に戻ってくると、副作用を忘れる可能性があります。一種の頭痛。

+0

元の名前を維持してデータフレームを返す良い方法はありますか?たとえば、上記のコードでdf < - dを指定する必要はありませんか? –

+0

上記の私の編集を参照してください。元のバージョンでは 'df < - d'は使用しないことに注意してください。' df <-add_ages(df) 'を使用してください。 – Josh

関連する問題