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

如何在R中按条件删除前导行和尾随行?

如何在R中按条件删除前导行和尾随行?,r,dplyr,rows,R,Dplyr,Rows,有一个数据集,其前导行和尾随行具有零值特征。如何以优雅的方式删除这些行 # Library library(tidyverse) # 1. Input data.frame( id = c(1:10), value = c(0, 0, 1, 3, 0, 1, 2, 8, 9, 0)) # 2. Delete leading and trimming rows with 'value = 0' # ... # 3. Desired outcome data.frame( id =

有一个数据集,其前导行和尾随行具有零值特征。如何以优雅的方式删除这些行

# Library
library(tidyverse)

# 1. Input
data.frame(
  id = c(1:10),
  value = c(0, 0, 1, 3, 0, 1, 2, 8, 9, 0))

# 2. Delete leading and trimming rows with 'value = 0'
# ...

# 3. Desired outcome
data.frame(
  id = c(3:9),
  value = c(1, 3, 0, 1, 2, 8, 9))
谢谢。

一个选项是

library(dplyr)   
df1 %>% 
  filter( cumsum(value) > 0 & rev(cumsum(rev(value)) > 0))
#  id value
#1  3     1
#2  4     3
#3  5     0
#4  6     1
#5  7     2
#6  8     8
#7  9     9

下面是一个简单的破解:

df %>%
  mutate(value2 = cumsum(value)) %>%
  filter(value2 != 0) %>%
  filter(!(value2 == max(value2) & value == 0)) %>%
  select(-value2)
  id value
1  3     1
2  4     3
3  5     0
4  6     1
5  7     2
6  8     8
7  9     9

一个选项是检查该值是否等于0,并且rleidvalue是否处于其最小值或最大值,即您处于第一组或最后一组值中。即使要保留的非零值为负值,这也会起作用

library(data.table)
setDT(df)

df[!(value == 0 & (rid <- rleid(value)) %in% range(rid))]

#    id value
# 1:  3     1
# 2:  4     3
# 3:  5     0
# 4:  6     1
# 5:  7     2
# 6:  8     8
# 7:  9     9
如果事先知道第一个和最后一个值始终为零,则只需检查第二个条件

df[!((rid <- rleid(value)) %in% range(rid))]