我想在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
我只是找不到我的函数的逻辑原因和错误所在,因此我感谢任何评论或建议。
答案 0 :(得分:3)
在循环中,当n
大于1时,i
从1开始可能会导致负索引或零索引(即,当n =2
,1 - 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