Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.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_Matrix_Zero - Fatal编程技术网

R 删除两个连续零前后的所有值/行

R 删除两个连续零前后的所有值/行,r,matrix,zero,R,Matrix,Zero,假设我有一个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

假设我有一个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行。

我已经为您编写了解决以下规则的代码:

规则A:删除任何列中带零的行

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
规则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

dat我已经为您编写了解决以下规则的代码:

规则A:删除任何列中带零的行

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
规则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


dat请提供带有数据的代码(机器可读格式)@HubertL。请使用
dput
导出数据,并提供预期的结果数据集,希望所有操作都正确完成。请提供带有数据的代码(机器可读格式)@HubertL这样做了。请使用
dput
导出您的数据,同时请提供预期的结果datasetDone,希望所有操作都正确。工作几乎完美,只是它删除了太多的一行(连续两个零后的第一行),这必须包含在输出中"... 在一行中删除两个零之前或之后的值。“我有点困惑。你不想要两者吗?我写这篇文章的方式是删除任何带零的行。另外,删除连续的零行之前和之后的任何行。这不是你想要的吗?当你说“在一行中”时也是这样“你真的是指连续两行?我想我明白了。你说在两个连续的零之后删除下面的两行?我知道这很混乱,但我实际上想要实现的是,在一种情况下,删除第二列中所有带零的行和第二列中两个连续零之后的所有行。另一种情况正好相反,如果I值不等于零,则删除第2列中带有零的所有行以及“before!”两个连续零的所有行。效果几乎完美,只是删除了太多的一行(两个连续零后的第一行),这必须包含在输出中"... 在一行中删除两个零之前或之后的值。“我有点困惑。你不想要两者吗?我写这篇文章的方式是删除任何带零的行。另外,删除连续的零行之前和之后的任何行。这不是你想要的吗?当你说“在一行中”时也是这样“你真的是指连续两行?我想我明白了。你说在两个连续的零之后删除下面的两行?我知道这很混乱,但我实际上想要实现的是,在一种情况下,删除第二列中所有带零的行和第二列中两个连续零之后的所有行。另一种情况正好相反,如果I值不等于零,则删除第2列中带零的所有行以及“before!”两个连续零的所有行。