我的数据框中标有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无需多次调用变换函数。
答案 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