在transform中引用新列

时间:2011-07-16 12:58:05

标签: r variables transform

我的数据框中标有A,B和B的列。 C.我想添加从现有列和新列本身计算的新列。为了实现这一点,我尝试使用这样的转换函数:

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

但这会产生错误:

  

eval(expr,envir,enclos)中的错误:找不到对象'NewD'

我也试过像这样的cbind函数:

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

但是当附加列(函数)的数量增加时,它会变得很麻烦。

如何在transform函数中引用NewD,或者有更好的方法来应用这样的多个函数。我希望数据包含列A,B,C,NewD& NewE无需多次调用变换函数。

3 个答案:

答案 0 :(得分:6)

也许是这样的

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

答案 1 :(得分:5)

Hadley在他的mutate包中有一个plyr函数,正是这样做的。以下是@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)

答案 2 :(得分:1)

以下是两种方法。我们使用内置数据框BOD

进行说明

<强>内

> 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

my.transform定义为here,允许用户引用新列:

> 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