2012-09-10 48 views
1

使用下面的代碼跨區別:陣列之間不使用循環

a <- seq(1, 10, 1) 
b <- seq(2, 20, 2) 

我想從b[i]減去a[i - 1]每個i,以獲得類似

c <- NULL 
for(i in 1:length(b)) { 
    c[i] <- b[i] - a[i - 1] 
} 

但我想這樣做沒有使用for()循環。

任何人都知道怎麼做只有一個命令行?

回答

2

由於您的ab長度相同,因此我假定您想先修剪掉b的最後一個元素。 (嘗試b - a[-1]明白爲什麼這可能是可取的。)

b[-length(b)] - a[-1] 
# [1] 0 1 2 3 4 5 6 7 8 
+0

謝謝;那麼我猜想沒有包裝函數來處理交叉差異,而沒有首先從陣列中刪除元素以對齊它們。 – user1638221

+1

@ user1638221 - 不是一個有名的基礎,但你總是可以這樣做:'f < - function(x,y)y [-length(y)] - x [-1]; f(1:10,20:11)'。 –

0

你可以用時間序列做到這一點:

a <- ts(seq(1, 10, 1)) 
b <- ts(seq(2, 20, 2)) 
b- lag(a,1) 
##----- 
Time Series: 
Start = 1 
End = 9 
Frequency = 1 
[1] 0 1 2 3 4 5 6 7 8 

這並不是說我一定推薦這個。基本的時間序列形式主義是一個備受爭議的混亂之源。大多數人避免它,優先考慮動物園和xts分類的對象。