【问题标题】:Mutate with function error: "numerical expression has <n> elements: only the first used"变异函数错误:“数值表达式具有 <n> 元素:仅第一个使用”
【发布时间】:2016-01-08 06:12:56
【问题描述】:

我想在数据框中使用自定义函数,该函数将两列的值组合起来,并将其添加到数据框中的第三列。

为了添加一列,我使用了 mutate 并且它工作得很好,例如如果我总结两列左右但使用自定义函数我会收到此错误:

数值表达式有32个元素:只使用第一个

函数如下:

 SigSum <- function(x,y) {
  result <- 0
  for(i in c(0:(x-1)))
  {
    result <- result + (1/factorial(i)) * y^i
  }
  return(result)
}

作为一个例子,我用mtcars尝试了它:

> bla <- mtcars  %>% mutate(bbb = SigSum(gear, carb))
Warning message:
In 0:(x - 1) : numerical expression has 32 elements: only the first used

如果我使用例如

> bla <- mtcars  %>% mutate(bbb = gear + carb)

我没有收到警告消息。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    您的函数包含错误。您的 for 语句不适用于向量输入。您要求的是 x 向量的循环,而不是向量 x 的长度。

    如果您按以下方式更改它,它将起作用:

    更新功能:

    SigSum <- function(x,y) {
      result <- rep(NA, length(x))
      for(i in 1:length(x)) {
        result[i] <- 0
        for(j in 0:(x[i]-1)) {
          result[i] <- result[i] + (1/factorial(j)) * y[i]^j
        }
      } 
      return(result)
    }
    

    【讨论】:

    • 我不是这个意思。使用此功能,我没有收到错误,但它没有做我想要的。 x 和 y 是我的数据框中 X 和 Y 列的数值(或 mtcars 中的 gear 和 carb)。
    • 数学函数应该是:Sum(from i=0 to x-1)(1/i! * y^i)
    • 我不明白这个。 x 是列中的值,例如4. length(x) then 始终为 1,因此循环只会运行一次,这没有任何意义...
    • length(x) 是你输入的向量的长度,而不是向量的值。如果您使用 mtcars$gear 这将是 32,因为有 32 个齿轮值。 j 将取 x[i] 的值,从值 1 到 32。所以对于齿轮的第一个值 4,j 将从 0 变为 3。我还确保将返回的结果添加到返回向量在正确的位置。它从错误的循环返回结果。
    • 使用你的函数我得到“错误:找不到对象'结果'”
    猜你喜欢
    • 2021-11-29
    • 2018-08-21
    • 1970-01-01
    • 2014-06-04
    • 2018-02-07
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2021-04-25
    相关资源
    最近更新 更多