2013-03-01 23 views
0

x的哪個數字大於5並落在第10個位置之後?這是位置11的數字。 但是我發現自己寫了一個長碼來得到答案,我想知道是否有更快的方法。什麼數字大於x並落在位置y

x <- c(5,7,3,6,9,4,1,4,7,10,8,5,7,9,7,1, 8, 4, 4,9); 

確定所有數字> 5調用它X1的位置:

x1 <- which(x>5); 

找出第10位後發生的位置(X1)的第一個數字:

first(which(x1 >10)) 

這識別x1的位置6;

標識在原有的向量號的位置(X):

x1[first(which(x1 >10))]; 

現在我們有我們要在原有的向量(x)的值的位置,該代碼拉動價值,我們想要:

x[x1[first(which(x1 >10))]] 

這似乎是一個很長的代碼來回答一個簡單的問題,你知道更短/更簡單的方法來獲得相同的結果嗎?

+1

你可以修復你的代碼中的所有語法錯誤。 R區分大小寫,所以'x'和'X'不一樣,'object'和''c'和'C'也不一樣。 – mnel 2013-03-01 04:03:18

+0

另外,我不確定你爲什麼認爲'first'是一個函數。它是否在你沒有提到的一些軟件包中? – joran 2013-03-01 04:03:50

+0

抱歉Joran,它的一個xts函數 – user2004820 2013-03-01 04:22:54

回答

4

一些非常簡單的索引和子邊界有什麼問題?

這給出了所有元素的在x指數大於5和10位置之後發生:

> which(x > 5 & seq_along(x) > 10) 
[1] 11 13 14 15 17 20 

所以最終的答案是

> which(x > 5 & seq_along(x) > 10)[1] 
[1] 11 

> head(which(x > 5 & seq_along(x) > 10), 1) 
[1] 11 

這裏使用的技巧是生成一個索引向量x使用seq_along()函數。這樣我們就可以在一個邏輯語句中生成所有匹配,然後選擇其中的第一個。

如果你想提取標識的元素,那麼:

> want <- which(x > 5 & seq_along(x) > 10)[1] 
> x[want] 
[1] 8 

[目前尚不清楚是否要確定哪些元素滿足您的條件或元素的值。]

+0

謝謝加文,這是有益的 – user2004820 2013-03-01 04:49:48

+0

@ user2004820如果是這樣,請考慮接受答案。查看[faq]中的[ask]部分,瞭解如何做到這一點以及爲什麼它對[so]有用。 – 2013-03-01 05:01:44

1

> Find(function(y) x[y] > 5 & y > 10, seq_along(x)) 
[1] 11 

或提取元件:使用functional編程以提取索引的替代版本

> x[Find(function(y) x[y] > 5 & y > 10, seq_along(x))] 
[1] 8 

雖然與簡單索引相比,不知道性能差異。

+0

謝謝mbask,我只是回頭看這個,並意識到它是「不同的」。我喜歡它作爲看待這個問題的另一種方式。 – user2004820 2013-03-04 17:57:39

相關問題