2016-06-13 6 views
0

YOB(生年)の列を含むデータフレーム(train)があります。関数内でDataFrameに新しい列を追加する

train$Age = 2016 - train$YOB 

これは正常に動作します:私はそうのように、別の列にAgeを計算したいと思います。

問題は、他のいくつかのデータフレームに対してこの操作を(他の前処理操作と一緒に)行いたいということです。だから、私は、関数内の共通部分を抽出し、関数へのパラメータとして処理されるデータフレームを渡すことを考えていた:

preprocess = function(d) { 
    d$Age = 2016 - d$YOB 
    # other transformations... 
} 

上記の関数を定義した後、私はpreprocess(train)を呼び出すことで、前述の変換を実行すると予想しました私のデータフレームしかし、それはしません。たとえば、train$Ageは、コール後にNULLです。

preprocess関数がデータフレームを期待どおりに変換しないのはなぜですか?これを修正する方法はありますか?

+0

'preprocess = function(d)d $ Age << - 2016 - d $ YOB'または' preprocess = function(d)2016 -d $ YOB; d $ age < - preprocess(d) 'です。関数内で作られたオブジェクトは '<< - '以外の関数の外にはありません。 – cuttlefish44

+0

@ crayfish44これで、 'closure'型のオブジェクトがサブセット化できないというエラーが表示される* – GolfWolf

答えて

1

関数内にのみ新しい列を追加しますが、通常、関数はその関数外の値を変更しません。 < <を介して迅速かつ汚れた方法がありますが、実際にそれを使用しないでください!あなたの関数は関数の外の値を変更するので、関数はそれを行うはずではありません。それは非常に悪いスタイルです。値は関数を引数として入力し、戻り値として残す必要があります。

だからあなたの関数内でデータフレームを変更し、戻り値として、それをお返し:コントロールが機能に転送されたときにR(と、ほぼすべての言語)で

preprocess = function(d) { 
    d$Age = 2016 - d$YOB 
    return(d) 
} 

test <- data.frame(YOB=2017:2020) 

test <- preprocess(test) 

print(test) 
2

、インタプリタは、「スコープ」を設定しますこの変数は関数内で利用可能である。

は、変数a、b及び機能「前処理」を検討してください:ここ

> a <- 2 
> b <- 3 
> preprocess <- function(a){a <- a + b; cat("value of a=", a, "\n")} 
> preprocess(a) 
value of a= 5 
> cat("value of a=", a, "\n") 
value of a= 2 

、変数「a」および「b」は、関数内の可視、および変数の値の両方でした「」機能の範囲内で変更されました。 しかし、関数が完了して返されると、この環境は破棄され、変数の更新された値は "失われました"。

2の前の変数のグローバル値は、そのままです。

> a <- 2 
> b <- 3 
> preprocess <- function(a){a <- a + b; cat("value of a=", a, "\n"); return(a)} 
> a <- preprocess(a) 
value of a= 5 
> cat("value of a=", a, "\n") 
value of a= 5 

がためにあなたのRセッション?environment内このヘルプリファレンスを参照してください:あなたは「」に変更されたの「」機能から、値の値をバック返す場合

しかし、この例を参照してください詳しくは。

関連する問題