我正在尝试创建一个函数,允许我根据最前一行(紧接在上面的行)的变量,将行追加到现有数据框中,多次。
#Here's what I'm starting with
Balance <- c(25000)
Pmt <- c(1500)
Interest <- c(.05)
DF <- data.frame(Balance,Pmt,Interest)
DF
Balance Pmt Interest
1 25000 100 0.05
例如,我希望看到新行的“余额”等于前一行的((Balance-Pmt)*(1 + Inerest))并且“ Pmt“和”兴趣“行保持不变。
# Manually
DF[2,1] <- (DF[1,1] - DF[1,2])*(1+DF[1,3])
DF[2,2] <- DF[1,2]
DF[2,3] <- DF[1,3]
D
Balance Pmt Interest
1 25000 1500 0.05
2 24675 1500 0.05
显然,我想多次复制这个,n,因为我不需要手动引用上一行。我想要一个函数,允许我按照我想要的那样多次向数据框添加行,遵循相同的逻辑。任何帮助表示赞赏!
答案 0 :(得分:4)
您可以设置数据框以考虑最终大小,而不是逐行构建数据框。在此示例中,您知道将运行此过程三次以总共四行结束。首先制作该数据框,使其余部分更容易,更快捷:
DF2 <- 'row.names<-'(DF[rep(1,4),], NULL)
DF2$Balance <- Reduce(function(x,y) (x - y)*(1+DF2[1,3]), DF2[-1,2], init=DF[1,1], acc=TRUE)
DF2
# Balance Pmt Interest
# 1 25000.00 1500 0.05
# 2 24675.00 1500 0.05
# 3 24333.75 1500 0.05
# 4 23975.44 1500 0.05
自学:减少如何工作?
Reduce
是一个更高级别的功能,以独特的方式工作,需要练习掌握。它包含两个主要部分,1)具有两个参数的函数和2)单个向量*。那是奇怪的部分。它需要一个带有两个args和一个向量的函数。起初这没有意义。它如何通过一个具有需要两个args的函数的向量?例如:
#one vector
x <- c(2,3,4,5)
#function with two arguments
multiply <- function(a, b) {a * b}
这是一个从2到5的向量,是一个简单的函数,它接受两个数字并将它们相乘。 Reduce
将接受这两个对象并执行此操作:
Reduce(multiply, x) #<- this
#is the same as
ans1 <- multiply(2, 3)
ans2 <- multiply(ans1, 4)
ans3 <- multiply(ans2, 5)
它遍历了向量c(2,3,4,5)
并取了前两个部分(2和3)并在它们上面调用了函数。然后它接受了这个答案并引入了x(4)的第三个元素来运行该函数,然后它接受了该答案并使用第四个元素(5)运行它。
在您的示例中,我们使用它来完成第一笔余额和付款:
#one vector
x <- c(25000, 1500, 1500, 1500)
#function with two arguments
f <- function(a,b) (a - b)*(1 + 0.05)
让我们看看它在内部做了什么:
Reduce(f, x) #what we did
#internally Reduce did this
ans1 <- (25000 - 1500) * (1 + 0.05)
ans2 <- (ans1 - 1500) * (1 + 0.05)
ans3 <- (ans2 - 1500) * (1 + 0.05)
这给了我们理想的过程。这就是我们所做的事情的想法。为了完全完成我们的讨论,我们添加了两个额外的参数来帮助我们获得理想的结果。 accumulate=TRUE
和init=DF[1,1]
。第一个简单地告诉Reduce我们想要每个连续的答案而不是最后一个答案。第二个告诉Reduce我们想要开始的价值。要显示init
做了什么:
#Supply vector for function
x <- DF[-1,2]
x
[1] 1500 1500 1500
#We need the initial balance
#init=DF[1,1] does:
[1] 25000 1500 1500 1500
Reduce也可以列出一个列表,但我们应该首先实现向量控制,然后引入列表方法。
答案 1 :(得分:1)
使用tvm: Time Value of Money Functions包:
library(tvm)
n <- 5
rem(cf = rep(1500, n), amt = 25000, r = 0.05)
# [1] 24750.00 24487.50 24211.88 23922.47 23618.59
答案 2 :(得分:0)
创建数据集:
Balance <- c(25000)
Pmt <- c(1500)
Interest <- c(.05)
DF <- data.frame(Balance,Pmt,Interest)
DF
1 25000 100 0.05
然后使用函数说n = 10次:
> for(i in 2:10){
+ DF[i,1] <- (DF[i-1,1] - DF[i-1,2])*(1+DF[i-1,3])
+ DF[i,2] <- DF[i-1,2]
+ DF[i,3] <- DF[i-1,3]
+ }
> DF
Balance Pmt Interest
# 1 25000.00 1500 0.05
# 2 24675.00 1500 0.05
# 3 24333.75 1500 0.05
# 4 23975.44 1500 0.05
# 5 23599.21 1500 0.05
# 6 23204.17 1500 0.05
# 7 22789.38 1500 0.05
# 8 22353.85 1500 0.05
# 9 21896.54 1500 0.05
# 10 21416.37 1500 0.05
您可以使用100或1000替换10,具体取决于您希望运行此功能的次数。
答案 3 :(得分:0)
您可以使用此功能
add_function <- function(n) invisible(replicate(n,{DF <<- rbind(DF,DF[nrow(DF),],make.row.names = F);DF[nrow(DF),1] <<- (DF[nrow(DF)-1,1]-DF[nrow(DF)-1,2])*(1+DF[nrow(DF)-1,3])}))
只需提供n