Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如何排除向量中的任何零以及两个连续零后的值?_R_Diff - Fatal编程技术网

R 如何排除向量中的任何零以及两个连续零后的值?

R 如何排除向量中的任何零以及两个连续零后的值?,r,diff,R,Diff,有一点我有很多问题:假设我有一个10x10的随机矩阵,列a如下所示。我现在要做的是排除列a中包含零的任何行。另外,必须排除两个连续零之后的任何值,以便b是我想要的目标向量 a <- c(13, 7, 2, 0, 4, 3, 0, 0, 5, 8) b <- c(13, 7, 2, 4, 3) a我们可以使用 a[cumsum(a == 0)<2 & a!=0] #[1] 13 7 2 4 3 或者另一种选择是 library(data.table) a1

有一点我有很多问题:假设我有一个10x10的随机矩阵,列
a
如下所示。我现在要做的是排除列
a
中包含零的任何行。另外,必须排除两个连续零之后的任何值,以便
b
是我想要的目标向量

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

b <- c(13, 7, 2, 4, 3)
a我们可以使用

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

或者另一种选择是

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
库(data.table)

a1如果要删除每个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
[1] 0.5 0.1 0.1 0.1

如果要删除每个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] 13  7  2  4  3
[1] 0.5 0.1 0.1 0.1

@rapuu更新了postMhh,我对实际数据应用了第二个代码,但它仍然包含“在”出现两个连续零之前的值。@rapuu您指的是
a[cumsum(a==0)>2&a!=0]
。你能用另一个例子来更新你的问题吗?checkDone,很抱歉没有正确地在@akrun处写向量。使用这个代码,上面写着:numeric(0),在我在原始帖子中编辑的第二个例子中使用@Lamia在第二个示例中,那么所有元素都不会被包括在内,是不是因为在开始时有4个连续的0?如果它只有两个连续的0,那么在第五个元素之后,即0.8,有两个连续的0对不起,我很困惑你的
前十个元素不应该包括在内
0.80.40.50.1 0.1 0.1是它吐出来的。只是0.8/0.4太多了,它不排除前两个缺点之后的任何值。零(从后面开始)。问题是,我必须开始排除从这个向量向后开始的零,例如,如果你理解我的意思:保持0.1,跳过零,保持0.1和0.5,就这样,因为两个零跟在后面,正如我在前面的评论中提到的,前两个连续的0出现在0.8之后。你期望的结果是什么?0.5 0.1 0.1 0.1是我想要的。在你的第二个例子中,连续两个0后不是0.5,因此应该删除吗?