Here's how to do it with dplyr . Basically, I only support rows that are not non-zero or that the previous / next lines are non-zero.
table1 %>% group_by(Id) %>% mutate(Lag=lag(sales),Lead=lead(sales)) %>% rowwise() %>% mutate(Min=min(Lag,Lead,na.rm=TRUE)) %>% filter(sales>0|Min>0) %>% select(-Lead,-Lag,-Min) Id Name Price sales Profit Month Category Mode Supplier (int) (chr) (int) (int) (int) (int) (chr) (chr) (chr) 1 1 A 2 5 8 3 XK John 2 1 A 2 5 8 4 XL Sam 3 2 B 2 3 4 1 XL Sam 4 3 C 2 0 0 1 XK John 5 3 C 2 8 10 2 YM John 6 3 C 2 8 10 3 YK John 7 3 C 2 0 0 4 YK John 8 5 E 2 0 0 1 YM Sam 9 5 E 2 5 5 2 YL Sam 10 5 E 2 5 9 3 YM Sam 11 5 E 2 0 0 4 ZM Kyle 12 5 E 2 5 8 5 ZL Kyle 13 5 E 2 5 8 6 ZM Kyle
Data
table1 <-read.table(text=" Id,Name,Price,sales,Profit,Month,Category,Mode,Supplier 1,A,2,0,0,1,X,K,John 1,A,2,0,0,2,X,K,John 1,A,2,5,8,3,X,K,John 1,A,2,5,8,4,X,L,Sam 2,B,2,3,4,1,X,L,Sam 2,B,2,0,0,2,X,L,Sam 2,B,2,0,0,3,X,M,John 2,B,2,0,0,4,X,L,John 3,C,2,0,0,1,X,K,John 3,C,2,8,10,2,Y,M,John 3,C,2,8,10,3,Y,K,John 3,C,2,0,0,4,Y,K,John 5,E,2,0,0,1,Y,M,Sam 5,E,2,5,5,2,Y,L,Sam 5,E,2,5,9,3,Y,M,Sam 5,E,2,0,0,4,Z,M,Kyle 5,E,2,5,8,5,Z,L,Kyle 5,E,2,5,8,6,Z,M,Kyle ",sep=",",stringsAsFactors =FALSE, header=TRUE)
UPDATE To filter more than one column with these criteria, here's how to do it. In this case, the result is the same, because when sales are 0, the profit is also 0.
library(dplyr) table1 %>% group_by(Id) %>% mutate(LagS=lag(sales),LeadS=lead(sales),LagP=lag(Profit),LeadP=lead(Profit)) %>% rowwise() %>% mutate(MinS=min(LagS,LeadS,na.rm=TRUE),MinP=min(LagP,LeadP,na.rm=TRUE)) %>% filter(sales>0|MinS>0|Profit>0|MinP>0) %>% # "|" means OR select(-LeadS,-LagS,-MinS,-LeadP,-LagP,-MinP)