滚动行减法

时间:2015-05-04 20:33:19

标签: r row subtraction

我正在寻找行减法,其中我有一组个体,我想从它上面的行中减去最近的行(就像滚动行减法一样)。有谁知道一个简单的方法来做到这一点?

数据看起来像这样:

    Name Day variable.1
1   Bob   1       43.4
2   Bob   2       32.0
3   Bob   3       18.1
4   Bob   4       41.2
5   Bob   5       85.2
6  Jeff   1       17.4
7  Jeff   2       55.6
8  Jeff   3       58.7
9  Jeff   4       40.6
10 Jeff   5       77.3
11 Carl   1       52.9
12 Carl   2       71.7
13 Carl   3       84.3
14 Carl   4       54.8
15 Carl   5       69.7

例如,对于Bob,我希望它出现为:

    Name Day variable.1
1   Bob   1       NA
2   Bob   2       -11.4
3   Bob   3       -13.9
4   Bob   4       23.1
5   Bob   5       44

然后它将转到下一个名称并执行相同的任务。

3 个答案:

答案 0 :(得分:4)

你可以尝试

library(data.table)#v1.9.5+
setDT(df1)[,variable.1:=c(NA,diff(variable.1)) , Name]

或者使用shift的开发版data.table(由@Jan Gorecki建议)。安装说明为here

setDT(df1)[, variable.1 := variable.1- shift(variable.1), Name]

答案 1 :(得分:3)

您可以使用基本ave()功能。例如,如果您的数据位于名为dd的数据框中,

dd$newcol <-ave(dd$variable.1, dd$Name, FUN=function(x) c(NA,diff(x)))

答案 2 :(得分:0)

您也可以尝试:

library(dplyr)
df %>% group_by(Name) %>% mutate(diff = variable.1-lag(variable.1))
Source: local data frame [15 x 4]
Groups: Name

   Name Day variable.1  diff
1   Bob   1       43.4    NA
2   Bob   2       32.0 -11.4
3   Bob   3       18.1 -13.9
4   Bob   4       41.2  23.1
5   Bob   5       85.2  44.0
6  Jeff   1       17.4    NA
7  Jeff   2       55.6  38.2
8  Jeff   3       58.7   3.1
9  Jeff   4       40.6 -18.1
10 Jeff   5       77.3  36.7
11 Carl   1       52.9    NA
12 Carl   2       71.7  18.8
13 Carl   3       84.3  12.6
14 Carl   4       54.8 -29.5
15 Carl   5       69.7  14.9