【问题标题】:Rolling subtraction to a column [duplicate]滚动减法到一列[重复]
【发布时间】:2017-07-09 13:34:01
【问题描述】:

我想对数据框中的列进行滚动减法。第 2 行将从第 1 行列中减去。

这里的目标是从 value 列中的第 1 行中减去第 2 行...并将其向下滚动到 data.frame

Excel 就是 =sum(B2-B1)

下面是一个示例数据框

    Date    Value       Diff
1   19280103    17.76   NA
2   19280104    17.72   -0.04
3   19280105    17.55   -0.17
4   19280106    17.66   0.11
5   19280107    17.68   0.02
6   19280109    17.5    -0.18
7   19280110    17.37   -0.13

【问题讨论】:

  • 查看?diff
  • (1) 您的数据框中没有Close 列,(2) 如果我们将Close 替换为Value,那么您显示的代码不会产生错误。如果您尝试将其分配回df(应该已在问题中显示),那么它将是df$Diff <- c(NA, diff(df$Value)) 请查看How to Askminimal reproducible example
  • diff 将返回一个短一个元素的向量。您只需要在您认为有必要时在开头或结尾添加一个。做c(NA, diff(...))
  • ok as running a vector...然后这是抛出替换/数据错误....放置 c(NA,diff(df$Value))。如果我将该列拉成向量并运行它可以工作的命令,但它不能将其放回数据帧,由于某种原因它想跳过 2x 并在开头放置两个 NA
  • 这不应该发生。

标签: r


【解决方案1】:

使用 dplyr 很容易,您可以使用滞后功能。

> library('dplyr')
> x <- c(1,3,5,6,7,8,9,10,5,4)
> y <- 1:length(x)
> 
> dt <- data.frame('x' = x, 'y' = y)
> 
> dt %>% mutate(diffx = x - lag(x, 1), diffy = y - lag(y, 1))
    x  y diffx diffy
1   1  1    NA    NA
2   3  2     2     1
3   5  3     2     1
4   6  4     1     1
5   7  5     1     1
6   8  6     1     1
7   9  7     1     1
8  10  8     1     1
9   5  9    -5     1
10  4 10    -1     1  

你也可以这样做:

> cbind(dt, 'diffx' = c(NA, diff(x)), 'diffy' = c(NA, diff(y)))
    x  y diffx diffy
1   1  1    NA    NA
2   3  2     2     1
3   5  3     2     1
4   6  4     1     1
5   7  5     1     1
6   8  6     1     1
7   9  7     1     1
8  10  8     1     1
9   5  9    -5     1
10  4 10    -1     1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多