删除包含零的data.frame行,其中相邻行包含零
我想删除所有包含零的行,但前提是(它下面的行是零,上面的行也是零)或(它是零,是第一个观察值,下面的数字也是零) 例如:删除包含零的data.frame行,其中相邻行包含零,r,R,我想删除所有包含零的行,但前提是(它下面的行是零,上面的行也是零)或(它是零,是第一个观察值,下面的数字也是零) 例如: RowNumb Column2 1 0 2 0 3 0 4 1 5 0 6 1 7 1 8 0 9 0 10
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,因为它们是唯一等于零的行,下面是零,上面是零或零(在rownum
1的情况下),因此我得到以下结果:
RowNumb Column2
3 0
4 1
5 0
6 1
7 1
8 0
有人知道不使用循环的方法吗?您可以使用
过滤器
将每个绝对值与前面和后面的绝对值求和,并将该和与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
以下是使用
lag
和lead
功能的dplyr
方法:
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
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), ]
或者更简单地说,“相邻行的值也为零”。谢谢,非常好用!你能更详细地解释一下它到底是如何工作的吗?我只是查了一下过滤函数,但还是不明白。谢谢使用过滤器
c(1,1,1)
和sides=2
函数将每个值与相邻值相加。我需要用前导零和尾随零填充输入,以便对第一行/最后一行进行特殊处理。
DF[apply(embed(c(0, DF$Column2, 0) != 0, 3), 1, any), ]