【问题标题】:I can't use "or loop with mutate(). Warning In 1:yrs : numerical expression has 6 elements: only the first used我不能使用“或循环使用 mutate()。警告在 1:yrs 中:数值表达式有 6 个元素:仅使用第一个元素
【发布时间】:2019-12-18 15:12:35
【问题描述】:

为一些单独工作的计算创建了一个函数。 但是,当我在mutate() 中使用它时,它似乎将列中的所有值作为输入并以警告消息结束:
In 1:yrs : numerical expression has 6 elements: only the first used

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))

我正在尝试使用每行中的数据运行函数mortgage(),但 mutate() 似乎将 period 中的所有值作为向量放入参数中。
谁能告诉我我可能做错了什么?

【问题讨论】:

  • 第一个警告是向量上的as_tibble。可以直接使用tibble
  • 这是一个警告,而不是错误。实际上,您确实获得了一列信用值;如果这是一个错误,情况就不会如此。但不清楚你期望得到什么——看起来你分配的参数不是你想要的顺序。你给参数yrs 提供了一个长度为6 的向量,那么for(i in 1:yrs) 没有意义,这就是警告的来源
  • @akrun 谢谢你的建议,我改变了它,但警告仍然存在并且没有按照我的预期工作。
  • @camille 确实警告没有按预期工作。我想做的是运行mortgage() 每一行每一列的哪些数据。对于第一行来说很好,因为它使用的是第一个元素。然而,在第二行,我希望它能够运行mortgage(800000, 20, 4279, 0.026)。第三行应该是mortgage(800000, 25,3630,0.026) 等等...

标签: r for-loop iteration dplyr


【解决方案1】:

对于这个特定问题,您可以使用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 循环未矢量化。不过,请记住,使用 rowwise 是按每一行分组的,所以如果您的数据集很大,它可能会很慢。

但是,您的函数似乎可以简化为这个函数,不需要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 :-)

因此,不需要rowwise

【讨论】:

  • 谢谢!这真的很好用!这是我第一次听说rowwise(),它确实解决了这个问题。新功能也起作用了,我一定是想多了。 >
猜你喜欢
  • 2018-08-21
  • 1970-01-01
  • 2021-08-17
  • 1970-01-01
  • 2021-04-25
  • 2018-02-07
  • 2014-06-04
  • 1970-01-01
  • 2021-12-21
相关资源
最近更新 更多