R ddply来自下一行的总和值

时间:2016-01-17 16:27:30

标签: r dataframe plyr

我想将行中的列值与下一行相加。

> df

+----+------+--------+------+
| id |  Val | Factor | Col  |
+----+------+--------+------+
|  1 |   15 |      1 |    7 |
|  3 |   20 |      1 |    4 |
|  2 |   35 |      2 |    8 | 
|  7 |   35 |      1 |   12 |
|  5 |   40 |      1 |   11 |
|  6 |   45 |      2 |   13 |
|  4 |   55 |      1 |    4 |
|  8 |   60 |      1 |    7 |
|  9 |   15 |      2 |   12 |
..........

我希望根据Row$ValnextRow$Val得到id + Col之和的平均值。我无法假设idCol是连续的。

我正在使用ddply来总结我的df。我试过了

> ddply(df, .(Factor), summarize, 
       max(Val), 
       sum(Val), 
       mean(Val + df[df$id == id+1 & df$Col = Col]$Val)
       )

> "longer object length is not a multiple of shorter object length"

3 个答案:

答案 0 :(得分:1)

您可以使用rollapply包中的zoo。由于您只想要连续两行,您可以尝试

library(zoo)
rollapply(df[order(df$id), 2], 2, function(x) sum(x)/2)

#[1] 17.5 27.5 35.0 37.5 42.5 50.0 57.5 37.5

答案 1 :(得分:1)

您可以使用

构建值向量
sapply(df$id, function(x){mean(c(
    subset(df, id == x, select = Val, drop = TRUE), 
    subset(df, id == x+1, select = Val, drop = TRUE)
    ))})

你可以简化,但我尽量让它变得可读。

答案 2 :(得分:0)

您可以使用dplyr包执行此类操作:

library(dplyr)
df <- arrange(df, id)
mean(df$Val + lead(df$Val), na.rm = TRUE)
[1] 76.25