Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.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
删除包含零的data.frame行,其中相邻行包含零_R - Fatal编程技术网

删除包含零的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), ]