我正在尝试创建一个新列,该列使用其先前值的百分比添加到相邻行的值之上。
例如,在50%时,我想看到这个:
# original
x = 1:10
# 1
# 2
# 3
# 4
# 5
# 6
# 7
# 8
# 9
# 10
我想要
# 1
# 2.5
# 4.25
# 6.125
# 8.0625
# 10.03125
# 12.015625
# 14.0078125
# 16.00390625
# 18.00195313
我可以弄清楚如何使用for
循环执行此操作,但我想知道是否有任何方法可以使用apply()
或其他任何利用R的功能的方法更快一些。< / p>
在Excel中,这很简单:
B2=A2+0.5*B1.
答案 0 :(得分:2)
Reduce
是另一种选择,详细了解其工作原理,请参阅this answer here
Reduce(function(x,y) y + 0.5*x, x, acc=TRUE)
#[1] 1.00000 2.50000 4.25000 6.12500 8.06250 10.03125 12.01562 14.00781 16.00391 18.00195
答案 1 :(得分:1)
一个选项是for(i in 2:length(x)) x[i] <- 0.5*x[i-1] + x[i]
x
#[1] 1.00000 2.50000 4.25000 6.12500 8.06250
#[6] 10.03125 12.01562 14.00781 16.00391 18.00195
循环
addStuff
答案 2 :(得分:1)
递归方法:
f <- function(n){
if (n<=1){
print(n)
return(n)
}
print(0.5*f(n-1)+n)
}
# for example
f(10)
# [1] 1
# [1] 2.5
# [1] 4.25
# [1] 6.125
# [1] 8.0625
# [1] 10.03125
# [1] 12.01562
# [1] 14.00781
# [1] 16.00391
# [1] 18.00195
如果您想保存递归f
函数的输出:
f <- function(n){
if (n<=1)
return(list(val=list(n), num=n))
back <- f(n-1)
back$val <- c(back$val, (0.5*back$val[[n-1]]+n))
back$num <- c(back$num, n)
return(back)
}
# for example
res <- f(10)
unlist(res$val)
# [1] 1.00000 2.50000 4.25000 6.12500 8.06250 10.03125 12.01562
# 14.00781 16.00391 18.00195