我想删除所有包含零的行,但仅限于if(下面的行为零且其上方的行也为零)或(它是零并且它是第一个观察值和下面的数字它也是零)。
例如:
RowNumb Column2
1 0
2 0
3 0
4 1
5 0
6 1
7 1
8 0
9 0
10 0
我想删除第1,2,9和10行,因为这些行是唯一等于零的行,其下方为零,零或零(在rowNumb
的情况下) 1)在他们之上,这样我得到以下内容:
RowNumb Column2
3 0
4 1
5 0
6 1
7 1
8 0
有没有人知道如何在不使用循环的情况下执行此操作?
答案 0 :(得分:4)
您可以使用filter
将每个绝对值与前后绝对值相加,并将该和与0进行比较:
DF <- read.table(text="RowNumb Column2
1 0
2 0
3 0
4 1
5 0
6 1
7 1
8 0
9 0
10 0", header=TRUE)
rem <- na.omit(filter(abs(c(0, DF$Column2, 0)), rep(1, 3)) != 0L)
DF[rem,]
# RowNumb Column2
#3 3 0
#4 4 1
#5 5 0
#6 6 1
#7 7 1
#8 8 0
这假定没有NA
个值。如果可能发生这种情况,您需要稍微修改一下:
x <- c(0, DF$Column2, 0)
rem <- na.omit(filter(x != 0L | is.na(x) , rep(1, 3)) != 0L)
答案 1 :(得分:3)
这是使用dplyr
和lag
函数的lead
方法:
require(dplyr)
df %>% filter(!(Column2 == 0 & lag(Column2, default = 0) == 0 & lead(Column2,default = 0) == 0))
# RowNumb Column2
#1 3 0
#2 4 1
#3 5 0
#4 6 1
#5 7 1
#6 8 0
答案 2 :(得分:2)
1)rollapply 这使用来自zoo包中的rollapply
来检查连续三个中的任何一个(并且因为partial=TRUE
两端连续两个)不是零:
library(zoo)
DF[ rollapply(DF$Column2 != 0, 3, any, partial = TRUE), ]
,并提供:
RowNumb Column2
3 3 0
4 4 1
5 5 0
6 6 1
7 7 1
8 8 0
1a)此变体也有效:
DF[ rollapply(c(0, DF$Column2, 0) != 0, 3, any), ]
2)嵌入此解决方案不使用任何软件包。对于此示例,embed
形成一个10 x 3矩阵,其行包含连续的三元组(连续两个,末尾为行的零),并从中计算逻辑矩阵并将any
应用于每一行:
DF[apply(embed(c(0, DF$Column2, 0) != 0, 3), 1, any), ]