r中的Excel OFFSET函数

时间:2013-02-28 12:53:00

标签: r excel offset

我正在尝试从Excel模拟OFFSET函数。我知道这可以针对单个值完成,但我想返回一个范围。我想返回一组偏移量为1且组大小为2的值。例如,在第4行,我希望有一个值为a列,第3行和第3行的组。对不起,但我很难过。

是否可以使用cbind或类似方法将此结果作为另一列添加到数据框?或者,我可以在矢量化函数中使用它,所以我可以求和或表示结果吗?

样机示例:

> df <- data.frame(a=1:10)
> df
    a
1   1
2   2
3   3
4   4
5   5
6   6
7   7
8   8
9   9
10 10

> #PROCESS 

> df
    a   b
1   1   NA
2   2   (1)
3   3   (1,2)
4   4   (2,3)
5   5   (3,4)
6   6   (4,5)
7   7   (5,6)
8   8   (6,7)
9   9   (7,8)
10 10   (8,9)

2 个答案:

答案 0 :(得分:3)

这应该可以解决问题:

df$b1 <- c(rep(NA, 1), head(df$a, -1))
df$b2 <- c(rep(NA, 2), head(df$a, -2))

请注意,结果必须存在两列,因为数据框中的列仅支持简单数据类型。 (除非你想诉诸复杂的数字。)带有负参数的head从尾部剪切参数的否定值,尝试head(1:10, -2)rep是重复,c是连接。 <-分配会添加一个新列,如果它尚未存在。

Excel调用OFFSET有时也称为 lag

编辑:根据Greg Snow的评论,这里的版本更优雅,但也更难理解:

df <- cbind(df, as.data.frame((embed(c(NA, NA, df$a), 3))[,c(3,2)]))

逐个组件尝试,看看它是如何工作的。

答案 1 :(得分:0)

你想要这样的东西吗?

> df <- data.frame(a=1:10)
> b=t(sapply(1:10, function(i) c(df$a[(i+2)%%10+1], df$a[(i+4)%%10+1])))
> s = sapply(1:10, function(i) sum(b[i,]))
> df = data.frame(df, b, s)
> df
    a X1 X2  s
1   1  4  6 10
2   2  5  7 12
3   3  6  8 14
4   4  7  9 16
5   5  8 10 18
6   6  9  1 10
7   7 10  2 12
8   8  1  3  4
9   9  2  4  6
10 10  3  5  8