R:在组上应用函数

时间:2015-01-28 15:43:13

标签: r aggregate apply

我希望将函数应用于数据框,然后将该函数的结果存储在数据框的新列中。

以下是我的数据框样本tradeData:

Login   AL  Diff
    a   1   0
    a   1   0
    a   1   0
    a   0   1
    a   0   0
    a   0   0
    a   0   0
    a   1   -1
    a   1   0
    a   0   1
    a   1   -1
    a   1   0
    a   0   1
    b   1   0
    b   0   1
    b   0   0
    b   0   0
    b   1   -1
    c   1   0
    c   1   0
    c   0   1
    c   0   0
    c   1   -1

" Diff"列是我要添加的列。它只是tradeData的值row(x-1)和row(x)之间的差异,按Login分组。

以下是我尝试过的一些示例:

tradeData$Diff = ave(tradeData$AL,tradeData$Login,FUN = function(x) {diff(x)}) 

tradeData$Diff = as.data.frame(with(tradeData,tapply(AL,Login,FUN = diff)))

到目前为止,我发现以下问题很有用:R applying a function to a subset of a data frame但我不确定如何从这里开始,因为我一直在收到错误。

由于

1 个答案:

答案 0 :(得分:3)

你可以尝试

 with(tradeData, ave(AL, Login, FUN=function(x) -1*c(0, diff(x))))
 #[1]  0  0  0  1  0  0  0 -1  0  1 -1  0  1  0  1  0  0 -1  0  0  1  0 -1

或使用data.table的选项。转换" data.frame"到" data.table"与setDT。按组(by=Login)获取当前值和下一个值之间的差异。 shift函数(在新的devel版本中引入)type等于"引导"得到下一个值。

 library(data.table)#data.table_1.9.5 
 setDT(tradeData)[, Diff:=AL-shift(AL, type='lead', 
                          fill=0) , by=Login][]