2010-08-16 32 views
1

我有第一個向量,讓我們假設x只包含1和-1。然後,我有第二個向量y,它由1,-1和零組成。現在,我想創建一個包含在索引中的向量z IA 1如果x[i]等於1和1 n個元素的先例之間(y[(i-n):i])向量y中存在...在R中創建沒有循環或遞歸的特定向量

更正式的:z <- ifelse(x == 1 && 1 %in% y[(index(y)-n):index(y)],1,0)

我正在尋找在R中創建這樣一個向量沒有循環或遞歸。上述命題不起作用,因爲它不承認逐個元素地表達y[(index(y)-n):index(y)]

非常感謝您的支持

回答

1

您可以使用apply這樣的,雖然它本質上是做一個循環一個漂亮的方式,但我不知道這是否會更快(它可能會或可能不會) 。

y1 <- unlist(lapply(1:length(x), function(i){1 %in% y[max(0, (i-n)):i]})) 
z <- as.numeric(x==1) * as.numeric(y1) 
+0

嗨尼科, 非常感謝您的及時和非常有益的意見,我會檢查的速度,但我寧願相信,您的解決方案比R.普通循環更快 親切, martin – martin 2010-08-16 07:03:45

2

下面是一個使用cumsum函數測試已迄今所看到的人的數量的方法。如果位置i的人數大於位置i-n的人數,則滿足右邊的條件。

## Generate some random y's. 
> y <- sample(-1:1, 25, replace=T) 
> y 
[1] 0 1 -1 -1 -1 -1 -1 1 -1 -1 -1 -1 0 0 -1 -1 -1 1 -1 1 1 0 0 0 1 
> n <- 3 
## Compute number of ones seen at each position. 
> cs <- cumsum(ifelse(y == 1, 1, 0)) 
> lagged.cs <- c(rep(0, n), cs[1:(length(cs)-n)]) 
> (cs - lagged.cs) > 0 
[1] FALSE TRUE TRUE TRUE FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE 
[13] FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE FALSE 
[25] TRUE 
+0

不錯的一個!我也想過使用'cumsum',但無法弄清楚如何實現滯後。 – nico 2010-08-16 11:46:03

+0

哇,非常感謝您的幫助 – martin 2010-08-17 02:15:38