2014-06-26 221 views
0

我有一個for循環在R中進行矩陣操作。對於某些檢查是真的,我需要再次來到同一行,意思是i需要被減1。無法減少R中「for」循環中的循環變量

for(i in 1:10) 
{ 
    if(some chk) 
    { 
    i=i-1 
    } 
} 

其實i是不減少我。舉例來說,在第五排我將我減少到4,所以它應該是5,但它是以6結尾。 請指教。

我的意圖是: 檢查一個矩陣的第一列值,如果我找到任何重複的值,我取第二列值並附加第一行的第二列並刪除重複的行。所以,當我刪除一行時,我不需要增加while循環中的i。 (這只是一個縮減地圖方法,追加同一個鍵的值)

+0

您應該在下面的評論內容中編輯您的問題,以便我們可以知道您的實際期望輸出是什麼。 –

回答

3

R for中的變量是隻讀的,您不能修改它們。你寫的東西在普通的R代碼中完全不同 - 根據實際問題的確切解決方案,沒有一個通用的直接替換(除了用一個while循環代替整個東西,但這是既醜陋又可能不必要)。

爲了說明這一點,請考慮這兩個典型例子。

  1. 假設您要過濾列表中的所有重複元素。您可以使用duplicated函數來告訴您每個元素是否重複,而不是遍歷列表並複製所有重複元素。

    其次,您使用standard R subsetting syntax僅選擇那些沒有重複的元素:

    x = x[! duplicated(x)] 
    

    (本例適用於一維向量或列表,但它可以推廣到更多的維度。)

  2. 對於更復雜的情況下,讓我們說,你有號碼的載體,在載體每甚至號碼,你要仔細前面的數字(這是高度人工化,但在信號處理,你可能面臨類似的問題)。換句話說:

    input = c(1, 3, 2, 5, 6, 7, 1, 8) 
    output = ??? 
    output 
    # [1] 1 6 2 10 6 7 2 8 
    

    ...我們要填寫???。在第一步中,我們檢查哪些數字是偶數:

    even = input %% 2 == 0 
    # [1] FALSE FALSE TRUE FALSE TRUE FALSE FALSE TRUE 
    

    接下來,我們的結果下移 - 因爲我們想知道下一個數是偶數 - 除去第一個元素,並附加一個虛擬元素(FALSE)。

    even = c(even[-1], FALSE) 
    # [1] FALSE TRUE FALSE TRUE FALSE FALSE TRUE FALSE 
    

    現在我們可以乘以二隻是這些輸入:

    output = input 
    output[even] = output[even] * 2 
    

    那裏,這樣做。

+0

因爲我需要一個簡單的矩陣遍歷「while」工作正常。 – Nadaraj

+0

@Nadaraj我確定你做錯了。如果你想遍歷一個矩陣,你不想手動操作索引,而且你也不想'for'或'while'。你想要像'apply'這樣的東西。 –

+0

我在做什麼,檢查第一列值,如果我發現任何重複值,我將刪除整個行。所以,當我刪除一行時,我不需要在while循環中增加'i'。如果您還有其他好方法,請與我分享。 – Nadaraj