R中此函数的逻辑有什么问题?

时间:2020-03-27 23:13:35

标签: r function loops functional-programming

我想在R中构建一个函数,该函数根据任意索引计算行之间的百分比变化,即在任何给定行与前一行或任何给定行与n前行之间。

perc_change <- function(x,n) {
    y <- c()
    z <- c()
        for (i in 1:length(x)) {
        z[i] <- (x[i]/(x[i-n])-1)*100
    }
    y <- c(rep(NA,n),z[(n+1):length(z)])
    y
}

n为1时,该功能可以正常工作:

    x <- c(2,3.5,4,6)
    perc_change(x,1)

[1]       NA 75.00000 14.28571 50.00000

但是当我更改为2或其他n时,会收到此错误:

Error in z[i] <- (x[i]/(x[i - n]) - 1) * 100 : 
  replacement has length zero

我只是找不到我的函数的逻辑原因和错误所在,因此我感谢任何评论或建议。

2 个答案:

答案 0 :(得分:3)

在循环中,当n大于1时,i从1开始可能会导致负索引或零索引(即,当n =21 - 2时)。为避免这种情况,可以添加一个if/else条件

perc_change <- function(x,n) {
      y <- c()
      z <- c()
          for (i in 1:length(x)) {
          if(i > n) {
          z[i] <- (x[i]/(x[i-n])-1)*100
         } else z[i] <- NA
     }
      y <- c(rep(NA,n),z[(n+1):length(z)])
      y
  }


perc_change(x,1)
#[1]       NA 75.00000 14.28571 50.00000
perc_change(x, 2)
#[1]        NA        NA 100.00000  71.42857
perc_change(x, 3)
#[1]  NA  NA  NA 200

答案 1 :(得分:2)

以下函数滞后于输入向量,然后使用向量化运算来计算百分比变化,而无需 Name ID Date URL ... ... ... ... 5 Jim 333 9/30/18 https://www.url6.com 6 Faye 111 3/31/17 https://www.url2.com 循环。 df.to_csv('~/file.csv', mode='a', header=False, index=False)函数是for的最后代码行的复制和粘贴。

lag