我正在尝试从Excel中模拟偏移函数。我知道可以对单个值执行此操作,但我希望返回一个范围。我想返回一组偏移量为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)发布于 2013-03-01 09:52:41
这应该能起到作用:
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所称的偏移有时也称为滞后。
编辑:下面是Greg Snow的评论,这是一个更优雅,但也更难理解的版本:
df <- cbind(df, as.data.frame((embed(c(NA, NA, df$a), 3))[,c(3,2)]))逐个组件地尝试它,看看它是如何工作的。
发布于 2013-03-01 06:02:10
你想要这样的东西吗?
> 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 8https://stackoverflow.com/questions/15136062
复制相似问题