R中的求和级数
Summation series in R
我目前正在尝试简化此求和。我是 R 的新手。
数据
Lx = c(5050.0, 65.0, 25.0, 19.0, 17.5, 16.5, 15.5, 14.5, 13.5, 12.5, 6.0, 0.0)
求和级数
Tx = c(sum(Lx[1:12]),sum(Lx[2:12]),sum(Lx[3:12]),sum(Lx[4:12]),
sum(Lx[5:12]),sum(Lx[6:12]),sum(Lx[7:12]),sum(Lx[8:12]),
sum(Lx[9:12]),sum(Lx[10:12]),sum(Lx[11:12]),sum(Lx[12:12]))
你可以这样做:
rev(cumsum(rev(Lx)))
[1] 5255.0 205.0 140.0 115.0 96.0 78.5 62.0 46.5 32.0 18.5 6.0 0.0
或者,使用 Reduce()
:
Reduce(`+`, Lx, right = TRUE, accumulate = TRUE)
[1] 5255.0 205.0 140.0 115.0 96.0 78.5 62.0 46.5 32.0 18.5 6.0 0.0
使用 for 循环:
Tx_new <- vector(length = length(Lx))
for (i in 1:length(Lx)) {
Tx_new[i] <- sum(Lx[i:length(Lx)])
}
一个可能的解决方案,使用sapply
:
sapply(1:12, function(x) sum(Lx[x:12]))
#> [1] 5255.0 205.0 140.0 115.0 96.0 78.5 62.0 46.5 32.0 18.5
#> [11] 6.0 0.0
请尝试以下代码:
Lx = c(5050.0, 65.0, 25.0, 19.0, 17.5, 16.5, 15.5, 14.5, 13.5, 12.5, 6.0, 0.0)
l=length(Lx)
aa=list()
for(i in 1:l)
{
x=sum((Lx[i:l]))
aa=append(aa,x)
}
求和后的所有值将在列表“aa”中。
包spatstat.utils
提供了反向累加和revcumsum
的快速版本(under certain conditions"),它基于计算sum(x[i:n])
和n = length(x)
(基本上是@Jan Brederecke 的回答):
Lx = c(5050.0, 65.0, 25.0, 19.0, 17.5, 16.5, 15.5, 14.5, 13.5, 12.5, 6.0, 0.0)
# install.packages("spatstat.utils")
spatstat.utils::revcumsum(Lx)
# [1] 5255.0 205.0 140.0 115.0 96.0 78.5 62.0 46.5 32.0 18.5 6.0 0.0
基准
x = c(5050.0, 65.0, 25.0, 19.0, 17.5, 16.5, 15.5, 14.5, 13.5, 12.5, 6.0, 0.0)
bm <- microbenchmark(
fRev(x),
fReduce(x),
fJan(x),
fEshita(x),
fsapply(x),
fRevcumsum(x),
times = 100L
)
autoplot(bm)
rev(cumsum(rev(Lx)))
和 spatstat.utils::revcumsum(Lx)
似乎是最快的解决方案。
我目前正在尝试简化此求和。我是 R 的新手。
数据
Lx = c(5050.0, 65.0, 25.0, 19.0, 17.5, 16.5, 15.5, 14.5, 13.5, 12.5, 6.0, 0.0)
求和级数
Tx = c(sum(Lx[1:12]),sum(Lx[2:12]),sum(Lx[3:12]),sum(Lx[4:12]),
sum(Lx[5:12]),sum(Lx[6:12]),sum(Lx[7:12]),sum(Lx[8:12]),
sum(Lx[9:12]),sum(Lx[10:12]),sum(Lx[11:12]),sum(Lx[12:12]))
你可以这样做:
rev(cumsum(rev(Lx)))
[1] 5255.0 205.0 140.0 115.0 96.0 78.5 62.0 46.5 32.0 18.5 6.0 0.0
或者,使用 Reduce()
:
Reduce(`+`, Lx, right = TRUE, accumulate = TRUE)
[1] 5255.0 205.0 140.0 115.0 96.0 78.5 62.0 46.5 32.0 18.5 6.0 0.0
使用 for 循环:
Tx_new <- vector(length = length(Lx))
for (i in 1:length(Lx)) {
Tx_new[i] <- sum(Lx[i:length(Lx)])
}
一个可能的解决方案,使用sapply
:
sapply(1:12, function(x) sum(Lx[x:12]))
#> [1] 5255.0 205.0 140.0 115.0 96.0 78.5 62.0 46.5 32.0 18.5
#> [11] 6.0 0.0
请尝试以下代码:
Lx = c(5050.0, 65.0, 25.0, 19.0, 17.5, 16.5, 15.5, 14.5, 13.5, 12.5, 6.0, 0.0)
l=length(Lx)
aa=list()
for(i in 1:l)
{
x=sum((Lx[i:l]))
aa=append(aa,x)
}
求和后的所有值将在列表“aa”中。
包spatstat.utils
提供了反向累加和revcumsum
的快速版本(under certain conditions"),它基于计算sum(x[i:n])
和n = length(x)
(基本上是@Jan Brederecke 的回答):
Lx = c(5050.0, 65.0, 25.0, 19.0, 17.5, 16.5, 15.5, 14.5, 13.5, 12.5, 6.0, 0.0)
# install.packages("spatstat.utils")
spatstat.utils::revcumsum(Lx)
# [1] 5255.0 205.0 140.0 115.0 96.0 78.5 62.0 46.5 32.0 18.5 6.0 0.0
基准
x = c(5050.0, 65.0, 25.0, 19.0, 17.5, 16.5, 15.5, 14.5, 13.5, 12.5, 6.0, 0.0)
bm <- microbenchmark(
fRev(x),
fReduce(x),
fJan(x),
fEshita(x),
fsapply(x),
fRevcumsum(x),
times = 100L
)
autoplot(bm)
rev(cumsum(rev(Lx)))
和 spatstat.utils::revcumsum(Lx)
似乎是最快的解决方案。