我能';t使用;或使用mutate()循环。1:yrs中的警告:数值表达式有6个元素:仅使用第一个元素

我能';t使用;或使用mutate()循环。1:yrs中的警告:数值表达式有6个元素:仅使用第一个元素,r,for-loop,dplyr,iteration,mutate,R,For Loop,Dplyr,Iteration,Mutate,为某些计算创建了一个函数,该函数本身运行良好。 但是,当我在mutate()中使用它时,它似乎将列中的所有值都作为输入,并以警告消息结束:in 1:yrs:numerical expression有6个元素:仅第一个使用的元素 library(dplyr) mortgage <- function(amt = 800000, yrs = 25, mthly = 3630, ints = 0.026) { yearPay <- mthly * 12 paid <- 0

为某些计算创建了一个函数,该函数本身运行良好。 但是,当我在
mutate()
中使用它时,它似乎将列中的所有值都作为输入,并以警告消息结束:
in 1:yrs:numerical expression有6个元素:仅第一个使用的元素

library(dplyr)

mortgage <- function(amt = 800000, yrs = 25, mthly = 3630,  ints = 0.026) {
  yearPay <- mthly * 12
  paid <- 0
  remain <- amt
  for(i in 1:yrs) {
    paid = paid + yearPay
    remain = (amt - paid) * (1 + ints)
  }
  return(remain*-1)
}


tibble(loanAmt = c(800000, 800000, 800000, 700000, 700000, 700000),
                    period = c(15,20,25,15,20,25),
                    monthly = c(5373, 4279, 3630, 4701, 3744, 3176),
                    interest = 0.026) %>%
  mutate(credit = mortgage(loanAmt, period, monthly, interest))
库(dplyr)

抵押贷款对于此特定问题,您可以使用
dplyr::rowwise

x1=tibble(loanAmt = c(800000, 800000, 800000, 700000, 700000, 700000),
       period = c(15,20,25,15,20,25),
       monthly = c(5373, 4279, 3630, 4701, 3744, 3176),
       interest = 0.026) %>%
  rowwise %>% 
  mutate(credit = mortgage(loanAmt, period, monthly, interest))
x1
这是因为
循环的
没有矢量化。不过,请记住,按行使用
是按每行分组的,因此如果数据集很大,则速度可能会很慢

但是,您的函数似乎可以简化为此函数,它不需要
for
循环:

mortgage2 <- function(amt, yrs, mthly,  ints) {
  remain = (amt - mthly * 12 * (yrs)) * (1 + ints)
  return(remain*-1)
}

x2=tibble(loanAmt = c(800000, 800000, 800000, 700000, 700000, 700000),
       period = c(15,20,25,15,20,25),
       monthly = c(5373, 4279, 3630, 4701, 3744, 3176),
       interest = 0.026) %>%
  mutate(credit = mortgage2(loanAmt, period, monthly, interest))
x2
all(x1$credit==x2$credit) # TRUE :-)
2%
变更(信贷=抵押2(贷款、期间、每月、利息))
x2
全部(x1$credit==x2$credit)#正确:-)

因此,不需要按行

第一个警告是向量上的
。您可以直接使用TIBLE,这是一个警告,而不是错误。事实上,你会得到一列信用值;如果这是一个错误,情况就不会是这样。但不清楚你期望得到什么,因为你似乎没有按照你想要的顺序分配论点。您为参数
yrs
指定了长度为6的向量,因此
for(i in 1:yrs)
没有意义,这就是警告的来源from@akrun谢谢你的建议,我更改了它,但是警告仍然存在,并且没有按我的预期工作。@camille确实警告没有按预期工作。我想做的是运行
mortgage()
从每一行的每一列中提取数据。对于第一行,这很好,因为它使用的是第一个元素。然而,在第二排,我希望它运行
抵押贷款(800000,204279,0.026)
。第三行应该是抵押贷款(800000253630,0.026)等等…谢谢!这真的很好!这是我第一次听说
rowwise()
,它确实解决了这个问题。新功能也起作用了,我一定是想得太多了谢谢!