2013-02-28 137 views
2

我試圖模擬Excel中的OFFSET函數。我明白,這可以做一個單一的值,但我想返回一個範圍。我想返回一組偏移值爲1,組大小爲2的值。例如,在第4行中,我希望有一組值爲列a,行3 & 2.對不起,但我我難住了。r中的Excel OFFSET函數

是否可以使用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) 
+1

你能更準確地知道你想要什麼樣的答案嗎?對於一個(可能稍小一些)的例子,你能構建你想要的R輸出嗎? – 2013-02-28 13:04:10

+0

'embed'函數做你想要的嗎? – 2013-03-01 05:29:53

+0

@GregSnow:不知道,很好!我已經添加了這個作爲我的答案的一個選項。 – krlmlr 2013-03-02 00:20:30

回答

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

編輯:繼格雷格·斯諾的評論,這裏有一個版本,這是更優雅,也更難以理解:

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

嘗試逐個部件,看看它是如何工作的。

+0

太棒了。我可以與此合作。鑑於數據框架中簡單數據類型的限制,我不認爲你可以做得更好。謝謝你的幫助。 – 2013-03-02 00:04:26

+0

@JamesKent:謝謝。我已更新我的帖子,以包括Greg Snow的評論。 – krlmlr 2013-03-02 00:20:11

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