【问题标题】:R How to use next row for same column calculationR如何使用下一行进行同一列计算
【发布时间】:2021-07-26 04:30:02
【问题描述】:

我一直在尝试在 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

【问题讨论】:

  • 你能详细说明你的逻辑吗?
  • @markus 例如在 excel 中,C2 值取决于 C3 值和 C4 值,您添加(或在 excel 中拖动)的行数越多,就会重新计算上面的行。这个 C2(在我的方法 f2 中)应该是创建的新列。希望现在更清楚了。再次感谢
  • 您还没有说如何获得所需的结果。例如,你如何得到 16?第 9 行那么你如何获得 60?那你怎么得到 192?
  • 对不起,我的解释,每f2行是由同一行列g* a,行+1列ga,行+2列ga,行+1列 f2*a,行+2 列 f2*a。第 9 行是 8*2,其余值为 0。第 8 行是 6*2+8*2+16*2,第 7 行是 6*2+6*2+8*2+60*2+16* 2...

标签: r loops dplyr lag lead


【解决方案1】:

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

【讨论】:

  • 这个answer 可能显示错误的值。第 3 行应该是 11232 而不是 11234。请验证并确认。
  • 效果很好!非常感谢,正如你所说,第 3 行是 11232。再次感谢
【解决方案2】:

这看起来像 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)

【讨论】:

  • 谢谢!我会选择另一种选择,因为我可能需要不同的系数和更多的行,再次感谢您!
猜你喜欢
  • 1970-01-01
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多