我正在尝试从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)
答案 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