[英]Function for Appending Rows to Data Frame Based on Previous Variable Values in R
我正在嘗試創建一個函數,該函數允許我根據最前一行(緊接在上方)的變量將行附加到現有數據框中,並進行多次。
#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
例如,我想查看添加的下4行,其中新行的“余額”等於上一行的((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次,而不必手動引用上一行。 我想要一個函數,它允許我按照相同的邏輯向數據幀中添加行多次。 任何幫助表示贊賞!
您可以設置數據幀時要牢記最終大小,而不是逐行構建數據幀,這將非常低效。 在此示例中,您知道將運行此過程三次,以總共四行結束。 首先創建該數據框,以使其余數據更加輕松快捷:
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)單個向量*。 那是奇怪的部分。 它需要一個具有兩個參數和一個向量的函數。 起初這沒有意義。 它如何通過一個帶有兩個參數的函數的向量? 例:
#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,我們想要每個連續的答案,而不僅僅是最后一個。 第二個告訴減少我們要開始的價值。 顯示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也可以列出一個列表,但是我們應該首先實現向量精通,然后介紹列表方法。
使用tvm:金錢的時間價值函數包:
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
創建數據集:
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,具體取決於要運行此功能的次數。
您可以使用此功能
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
的值
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.