【问题标题】:Rolling Row Subtraction [duplicate]滚动行减法[重复]
【发布时间】:2015-05-04 20:33:19
【问题描述】:

我希望执行行减法,其中我有一组人,我想从它上面的行中减去最近的行(如滚动行减法)。有谁知道一个简单的方法来做到这一点?

数据看起来像这样:

    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

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

【问题讨论】:

    标签: r row subtraction


    【解决方案1】:

    你可以试试

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

    或者使用data.table 的开发版本中的shift(如@Jan Gorecki 所建议的那样)。安装说明为here

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

    【讨论】:

    • 那么shift 呢?已经稳定的功能
    【解决方案2】:

    您可以使用基本的ave() 函数。例如,如果您的数据位于名为 dd 的 data.frame 中,

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

    【讨论】:

      【解决方案3】:

      你也可以试试:

      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
      

      【讨论】:

      • DatamineR,太棒了!它运作良好。我唯一的另一个问题是有些人有不同数量的数据。例如,Bob 可能有 5 行,但 Jeff 只有 3 行。有没有快速的解决方法?谢谢,
      • 应该没问题。你试过了吗?
      • 我有。它给了我一些错误,“错误:错误的结果大小(46),预期为 23 或 1”
      • 你能举一个可重现的例子吗?
      猜你喜欢
      • 1970-01-01
      • 2021-05-15
      • 2018-05-21
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      相关资源
      最近更新 更多