2011-07-16 12 views
8

私は、A、B &というラベルの付いた列のデータフレームを持っています。既存の列と新しい列自体から計算された新しい列を追加します。これを実現するために私はこのような変換関数を使用してみました:変換内で新しい列を参照する

Data = transform(Data, 
      NewD = A + B, 
      NewE = C * NewD 
) 

しかし、これはエラーを与える:

NewD = Data$A + Data$B, 
NewE = Data$C * New$D 
Data=cbind(Data,NewD,NewE) 

しかし:

Error in eval(expr, envir, enclos) : object 'NewD' not found

私はまた、このようなCBIND機能を試してみました追加の列(関数)の数が増えると面倒です。

どのように変換関数内でNewDを参照することができますか、またはこのような複数の関数を適用するより良い方法があります。私はデータが列A、B、C、NewDを含むようにします& NewEは何度も変換関数を呼び出す必要はありません。

+2

がplyr – hadley

答えて

5

Leyは彼のplyrパッケージにmutateという機能を持っています。 @Karstenがmutateを使って使ったのと同じ例です。私はmutateコードがその中に一時的な割り当てを必要としないので、そのようなタスクのために読みやすいと思っています。

require(plyr) 
d = data.frame(a = 1:5, b = 6:10) 
mutate(d, c = a + b, d = b * c, e = c * d) 
+0

私は上記の答えのいくつかを試していますが、これは素晴らしいです。 「要約」機能と同様の代替機能はありますか?つまり、既存のデータフレームに追加されません。私は図書館には見えませんでした。 –

6

多分これ

d <- data.frame(a=1:5, b=6:10) 
transform(d, c=tmp <- a+b, e=b*tmp) 

のようなものは、それをしませんか?

+0

から+1素敵を変異させてみて、私はその –

+0

+1非常に素晴らしいアイデアにアサインの –

+0

ニース使用をしようとするとは思いませんでした。 –

1

ここにはいくつかの方法があります。

my.transform

my.transformhere定義され、1つは、新しい列を参照することを可能にさ

> within(BOD, { a <- Time + 1; b <- a + 1 }) Time demand b a 1 1 8.3 3 2 2 2 10.3 4 3 3 3 19.0 5 4 4 4 16.0 6 5 5 5 15.6 7 6 6 7 19.8 9 8 

内:

> my.transform(BOD, a = Time + 1, b = a + 1) 
    Time demand a b 
1 1 8.3 2 3 
2 2 10.3 3 4 
3 3 19.0 4 5 
4 4 16.0 5 6 
5 5 15.6 6 7 
6 7 19.8 8 9 
我々は、データフレーム BODに内蔵使用示します
関連する問題