Excel中的OFFSET函数

我正试图模拟Excel中的OFFSETfunction。 我明白,这可以做一个单一的值,但我想返回一个范围。 我想返回一组偏移值为1,组大小为2的值。例如,在第4行上,我想要一个具有列a,行3和2的值的组。难倒了。

是否有可能作为另一列使用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 ab 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) 

这应该做的伎俩:

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

请注意,结果必须分为两列,因为数据框中的列仅支持简单的数据types。 (除非你想诉诸复杂的数字),否定论点的head从尾巴削减参数的否定价值,试试head(1:10, -2)rep是重复的, c是串联的。 <-赋值将添加一个新的列,如果它还没有。

Excel称为OFFSET有时也被称为滞后

编辑 :格雷格·斯诺的评论,这是一个更优雅的版本,但也更难以理解:

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

试试按组件分组来看看它是如何工作的。

你想要这样的东西吗?

 > 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