【问题标题】:Error number of items to replace is not a multiple of replacement length错误要替换的项目数不是替换长度的倍数
【发布时间】:2018-03-07 01:04:08
【问题描述】:

我意识到其他帖子中提到了这个错误,但我仍然无法弄清楚它如何适用于我的特定情况。我有以下代码。

myfun <- function(x, g, o){
  y <- x

  fs <- ((g-1)/o) * (o*g/((g-1)*(1+o)))^g
  xb <- o/(g-1)

  y[x>=xb] <- ((x+o)/(1+o))^g
  y[x<xb] <- x*fs

  return(y)
}

x <- seq(0,1,length=5)
y <- myfun(x, 1.5, 0.05)

我的代码返回以下错误。

Warning messages:
1: In y[y >= xb] <- ((x + o)/(1 + o))^g :
   number of items to replace is not a multiple of replacement length
2: In y[y < xb] <- x * fs :
   number of items to replace is not a multiple of replacement length

此外,结果似乎不正确。

我期待

y = 
    0 0.152720709664243 0.379105500429200 0.665044998814453 1

但得到:

y = 
    [1] 0.00000000 0.01039133 0.15272071 0.37910550 0.66504500

这让我相信我在索引中做错了什么,或者向量 x 上的数学有问题。任何帮助将非常感激。

【问题讨论】:

    标签: r


    【解决方案1】:

    通过构造,x 的长度为 5,因此 y((x+o)/(1+o))^g 的长度也为 5。

    但是,测试 x&gt;=xb 仅适用于 5 个元素中的 4 个元素,因此 y[x&gt;=xb] 的长度为 4 个元素。因此,您的分配 y[x&gt;=xb] &lt;- ((x+o)/(1+o))^g 发生冲突,因为这两个元素的长度不同。

    我猜你想要做的事情是这样的

    y[x>=xb] <- ((x[x>=xb]+o)/(1+o))^g
    y[x<xb] <- x[x<xb]*fs
    

    我明白了

    >y
    [1] 0.0000000 0.1527207 0.3791055 0.6650450 1.0000000
    

    这离你想要的很近,我会让你弄清楚。

    【讨论】:

    • 谢谢...这是正确的。当您的答案弹出时,我自己想通了,但我很欣赏确认和完整描述原因。
    • 另一种选择是使用 ifelse 函数。
    猜你喜欢
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    相关资源
    最近更新 更多