2017-05-30 22 views
0

讓我們說我有一個10x3矩陣m,我要檢查所有的零和在第一列的兩個連續零。我想刪除在一排中的第一列包含零和與所有行也在第一列中的兩個連續零從所述基質中的某一點開始後所有其他行或者去除或前值兩個零。刪除所有值/行之前和之後的連續兩個零

 col1 col2 col3 
[1,] 2 2 2 
[2,] 2 2 2 
[3,] 2 2 2 
[4,] 2 2 2 
[5,] 2 0 2 
[6,] 2 2 2 
[7,] 2 0 2 
[8,] 2 0 2 
[9,] 2 2 2 
[10,] 2 2 2 

dput= structure(c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 
0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), .Dim = c(10L, 3L), .Dimnames = list(
NULL, c("col1", "col2", "col3"))) 


expected result=  col1 col2 col3 
       [1,] 2 2 2 
       [2,] 2 2 2 

刪除行1,2,3,4,5,6,7和8

+0

請提供代碼的數據(以機器可讀格式) – HubertL

+0

@HubertL這樣做。 – rapuu

+0

請使用'dput'導出您的數據 – HubertL

回答

0

我給你寫代碼來解決以下規則:

規則A:在任一列刪除了零行

規則B:刪除任何列連續零之前的所有行

1 2 3 4 5 6 7 8 9 10 # Row Number 
2 2 2 2 0 2 0 0 2 2 # Column 2 
* * * * * * * * 2 2 # * = Remove 
B B B B C B A A - - # Rule Why Removed 

哪裏C既是A + B發生。如果在第10行之後有單行(非連續)零後面的行,它們將被刪除。

這裏我們刪除了1:8。 這裏是我的方法:

dat <- structure(c(2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 
        0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2), .Dim = c(10L, 3L), .Dimnames = list(
        NULL, c("col1", "col2", "col3"))) 
dat 

ToRemove <- apply(dat, 2, function(colmn) { 
    row.zeros <- which(colmn == 0) # rows with zeros 
    if(length(row.zeros) > 0) { # if we found any 
    # which of them is the last double 
    last.doubles <- max(which(diff(row.zeros) == 1)) 
    leftof.last.doubles <- "if"(length(last.doubles) > 0, # if double exists 
           1:(row.zeros[last.doubles]-1), # all rows before 
           NULL) # else nothing 
    # remove rows with single zeros and all rows before double consecutive 
    unique(c(row.zeros, leftof.last.doubles)) } 
}) 

ToRemove 
#$col1 
#NULL 
# 
#$col2 
#[1] 5 7 8 1 2 3 4 6 
# 
#$col3 
#NULL 

dat[-unlist(ToRemove),] 
#  col1 col2 col3 
#[1,] 2 2 2 
#[2,] 2 2 2 
+0

曾爲幾乎完美,這只是它刪除一行太多(第一行的連續2個零之後),它必須被包含在輸出 – rapuu

+0

」 ......之前或在連續兩個零之後,去除值。 「我有點困惑。你不想兩個?我寫這個的方式是刪除任何一行爲零。此外,刪除連續的零行之前和之後的任何行。這不是你想要的嗎? –

+0

當你說「連續」你真的意味着在兩個連續的行? XD –

相關問題