2

我正在尝试从 Excel 模拟 OFFSET 函数。我知道这可以为单个值完成,但我想返回一个范围。我想返回一组偏移量为 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
    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)
4

2 回答 2

3

这应该可以解决问题:

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

请注意,结果必须存在于两列中,因为数据框中的列仅支持简单数据类型。(除非你想求助于复数。)head用负参数从尾部切掉参数的否定值,try 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)]))

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

于 2013-03-01T01:52:41.190 回答
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
于 2013-02-28T22:02:09.853 回答