2017-05-29 69 views
1

有一點我有很多問題:假設我有一個隨機的10x10矩陣,列a你看下面。我現在想要做的是排除列a中包含零的任何行。此外,必須排除兩個連續零後的任何值,以便b是我想要的目標向量。如何在矢量和值連續兩個零後排除任何零點?

a <- c(13, 7, 2, 0, 4, 3, 0, 0, 5, 8) 

b <- c(13, 7, 2, 4, 3) 

我已經嘗試過不同的lags應用diff功能,但沒有真正制定出這麼遠。我感謝任何幫助!

第二示例:d < - C(0,0,0,0,0.8,0,0,0.4%,0,0,0.5,0.1,0,0.1,0.1)

第一十個元素不應該包括在內,也許我忘了提及我想在第一個連續的兩個零後面排除所有的值。

+0

在第二個例子中,沒有一個元素會被包含,因爲在開始處有4個連續的0?如果它只有2個連續的0,那麼在第5個元素之後,即。 0.8,有2個連續0的抱歉,我很困惑你的'前10個元素不應該包括在內' – akrun

+0

0.8 0.4 0.5 0.1 0.1 0.1是它吐出來的。只是0.8/0.4太多了,它不排除前兩個缺點後的任何值。零(從這個背後開始)。事情是,我必須開始排除在此向量上向後開始的零,例如,如果你明白我的意思:保持0.1,跳過零,保持0.1和0.5,就是這樣,因爲兩個零跟隨 – rapuu

+0

正如我在前面提到的在前面的評論中,前2個連續0發生在0.8之後。你期望的輸出是什麼 – akrun

回答

1

我們可以使用

a[cumsum(a == 0)<2 & a!=0] 
#[1] 13 7 2 4 3 

要獲得其他值

a[cumsum(a == 0)>2 & a!=0] 
#[1] 5 8 

或者另一種選擇是

library(data.table) 
a1 <- a[seq_len(which((a== 0) & (shift(a, fill =0, type = 'lead')==0))-1)] 
b <- a1[a1!=0] 
b 
#[1] 13 7 2 4 3 
+0

@rapuu更新了帖子 – akrun

+0

Mhh,我將第二個代碼應用到了我的實際數據中,但它仍然包含兩個連續0出現之前的值。 – rapuu

+0

@rapuu你的意思是'a [cumsum(a == 0)> 2&a!= 0]'。你能用另一個例子來更新你的問題來檢查 – akrun

1

如果你想刪除每一個0和一切這是在連續兩個0之後出現的,喲ü可以做到這一點是這樣的:你的載體用逗號分隔的數字轉換成字符串,使用正則表達式來去除不需要的元素,然後再轉換回數字矢量形式:

## gsub("0\\,|(0\\,){2}.*","",..) removes every 0 and every two zeros followed by anything 
a = c(13,7,2,0,4,3,0,0,5,8) 
b = as.numeric(unlist(strsplit(gsub("0\\,|(0\\,){2}.*","",paste0(a,collapse=",")),","))) 

這將返回:

[1] 13 7 2 4 3 

如果你想刪除自帶的每一個0和一切之前的連續兩個0:

d = c(0, 0, 0, 0, 0.8, 0, 0, 0.4, 0, 0, 0.5, 0.1, 0, 0.1, 0.1) 
c = as.numeric(unlist(strsplit(gsub("0\\,|.*(0\\,){2}","",paste0(d,collapse=",")),","))) 

這將返回:

[1] 0.5 0.1 0.1 0.1 
+0

使用這個代碼它說:數字(0),用於我在原始文章中編輯的第二個例子。 @Lamia – rapuu