R应用并获取上一行的值

时间:2014-01-08 03:20:22

标签: r matrix apply cells

我想将前一行值用于涉及当前行的计算。矩阵看起来像:

      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])

但它不起作用。

有什么想法吗?

感谢。

3 个答案:

答案 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