2017-05-29 71 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