我想将前一行值用于涉及当前行的计算。矩阵看起来像:
A B
[1,] 1 2
[2,] 2 3
[3,] 3 4
[4,] 4 5
[5,] 5 6
我想执行以下操作:(cell[i]/cell[i-1])-1
,基本上计算从当前行到前一行(不包括第一行)的%更改(-1到1)。
输出应如下所示:
C D
[1,] NA NA
[2,] 1.0 0.5
[3,] 0.5 0.33
[4,] 0.33 0.25
[5,] 0.25 0.20
这可以使用for循环轻松完成,但我正在处理大型数据集,所以我想使用apply(或其他内置函数)来提高性能和更清晰的代码。
到目前为止,我已经提出:
test.perc <- sapply(test, function(x,y) x-x[y])
但它不起作用。
有什么想法吗?
感谢。
答案 0 :(得分:4)
df/rbind(c(NA,NA), df[-nrow(df),]) - 1
会奏效。
答案 1 :(得分:1)
1)分裂
ans1 <- DF[-1,] / DF[-nrow(DF),] - 1
或rbind(NA, ans1)
如果在第一行中拥有NA很重要
2)差异
ans2 <- exp(sapply(log(DF), diff)) - 1
或rbind(NA, ans2)
如果在第一行中拥有NA很重要
3)diff.zoo
library(zoo)
coredata(diff(as.zoo(DF), arithmetic = FALSE)) - 1
如果开头有NA
很重要,那么添加na.pad=TRUE
这样的参数:
coredata(diff(as.zoo(DF), arithmetic = FALSE, na.pad = TRUE)) - 1
答案 2 :(得分:1)
或者,坚持使用原始sapply
方法:
sapply(dat, function(x) x/c(NA,head(x,-1)) - 1 )
@ user3114046答案的变体:
dat/rbind(NA,head(dat,-1))-1
# A B
#[1,] NA NA
#[2,] 1.0000000 0.5000000
#[3,] 0.5000000 0.3333333
#[4,] 0.3333333 0.2500000
#[5,] 0.2500000 0.2000000