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