R如何使用下一行进行同一列计算

R How to use next row for same column calculation

我一直在尝试在 R 中复制一些基本的 Excel 计算,但我找不到正确的解决方案。

我想创建一个 data.frame 的新列,但是正在计算的值应该基于同一列的下一个值,所以它是从下向上计算的。

我可以使用同一列(前一列)的值来完成此操作,但不适用于下一列。

我的方法的第一部分工作正常(当使用另一列的下一个值时),但不是在同一列中。

在excel中很简单,但无法实现。

另外,我不知道 for 循环是否是最好的选择,我必须用 100 万行来做 data.frame 所以它可能很慢。

提前谢谢你。

p <- c(1,2,3,4,5,6,7,6,8,9,10)
g <- c(4,4,3,4,5,6,6,6,8,0,0)
data <- data.frame(p,g)
a <- 2

我的方法

data$f2<- 0
for (i in 1:nrow(data)){
  data$f2[i] = data$g[i]*a+data$g[i+1]*a+data$g[i+2]*a+data$f2[i+1]*a+data$f2[i+2]*a
}


#Output
   g f2

1  4 22
2  4 22
3  3 24
4  4 30
5  5 34
6  6 36
7  6 40
8  6 28
9  8 16
10 0 NA
11 0 NA
> 

#Desired Correct Output

    g    f2
   
1     4 11232
2     4 11232
3     3 11232
4     4  4106
5     5  1498
6     6   540
7     6   192
8     6    60
9     8    16

这看起来像一个 Arma 计算。 您可以使用 signal 包中的 filter 函数:

library(signal)

a <- 2
f <- signal::Arma(b=rep(a,3),a=c(1,-rep(a,3)))

signal::filter(f,sort(g,decreasing=T))
# [1]     16     60    192    540   1498   4106  11234  30704  83898 229218 626238

data$f2 <- sort(signal::filter(f,sort(g,decreasing=T)),decreasing=T)

# A tibble: 11 x 3
       p     g     f2
   <dbl> <dbl>  <dbl>
 1     1     4 626238
 2     2     4 229218
 3     3     3  83898
 4     4     4  30704
 5     5     5  11234
 6     6     6   4106
 7     7     6   1498
 8     6     6    540
 9     8     8    192
10     9     0     60
11    10     0     16

一些评论:

  • 不确定为什么你的计算没有超过 11234
  • Arma 滤波器的系数发散,如下面的 zplane 所示:x(滤波器的极点)应全部在单位圆内才能实现稳定的滤波器。
    事实并非如此 => 结果将 Inf 达到百万行
zplane(f)

base R解决方案

代码:

data$f2 <- 0

for ( i in rev(seq_len(nrow(data)-2))) {
  data$f2[i] <-  with(data, sum( na.omit( c( g[c(i + 0:2)], f2[c(i + 1:2)])) * a                               
                               ) 
                     )
}

输出

 data
 #    p g    f2
 #1:  1 4 83882
 #2:  2 4 30698
 #3:  3 3 11232
 #4:  4 4  4106
 #5:  5 5  1498
 #6:  6 6   540
 #7:  7 6   192
 #8:  6 6    60
 #9:  8 8    16
 #10:  9 0     0
 #11: 10 0     0