R 删除两个连续零前后的所有值/行
假设我有一个10x3矩阵m,我想检查第一列中的所有零和两个连续零。我想删除第一列中包含零的所有行,以及第一列中两个连续零之后的所有其他行,从矩阵中的某个点开始,并删除行中两个零之前或之后的值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
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!”两个连续零的所有行。