【问题标题】:R ddply sum value from next rowR ddply 下一行的总和值
【发布时间】:2016-01-17 16:27:29
【问题描述】:

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

> 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 |
..........

我想根据id 和Col 得到Row$Val + nextRow$Val 的总和的平均值。我不能假设id 或Col 是连续的。

我正在使用 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"

【问题讨论】:

  • 小心,如果你在取平均值之前求和,你只是在返回总和。 mean 类似于 mean(c(3, 5))。或者,只需在求和后手动除以 2。
  • 只需将值移一即可。
  • @alistaire 谢谢。很高兴知道。关于如何解决问题的任何建议?
  • @DavidArenburg 你能花点钱吗?
  • 类似x <- 1:10 ; (head(x, -1) + tail(x, -1))/2 的东西(使用一些模拟数据)。如果你想按组使用ave。或者可以使用来自dplyr 的lag 与group_by 的组合,或来自data.table 的shift 与by 的组合。我敢肯定 SO 上有很多这样的东西。

标签: r dataframe plyr


【解决方案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】:

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

    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
    

    【讨论】:

    • 这是一个简化的例子。我不能假设它们是连续的。
    【解决方案3】:

    你可以用dplyr包做这样的事情:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-18
      • 2012-11-29
      相关资源
      最近更新 更多