假设我有这个数据集
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
我想删除具有零的行Sales
和Profit
逐个列的行Id
所以Id
如果两个或多个连续的行的值为零sales
,profit
那么这些行将被删除.所以这个数据集将变成这样.
Id Name Price sales Profit Month Category Mode Supplier 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 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
我可以删除所有行,如果他们有零个值Sales
,并Profit
用
df1 = df[!(df$sales==0 & test$Profit==0),]
但是在这种情况下如何通过Id删除仅在某些组中的行
PS这个想法是删除这些产品的条目,如果它们在几个月后开始销售,或者在一年周期中几个月后被放弃.
这是一种使用rleid
"data.table"的方法:
library(data.table) as.data.table(mydf)[, N := .N, by = .(Id, rleid(sales == 0 & Profit == 0))][ !(sales == 0 & Profit == 0 & N >= 2)] ## Id Name Price sales Profit Month Category Mode Supplier N ## 1: 1 A 2 5 8 3 X K John 2 ## 2: 1 A 2 5 8 4 X L Sam 2 ## 3: 2 B 2 3 4 1 X L Sam 1 ## 4: 3 C 2 0 0 1 X K John 1 ## 5: 3 C 2 8 10 2 Y M John 2 ## 6: 3 C 2 8 10 3 Y K John 2 ## 7: 3 C 2 0 0 4 Y K John 1 ## 8: 5 E 2 0 0 1 Y M Sam 1 ## 9: 5 E 2 5 5 2 Y L Sam 2 ## 10: 5 E 2 5 9 3 Y M Sam 2 ## 11: 5 E 2 0 0 4 Z M Kyle 1 ## 12: 5 E 2 5 8 5 Z L Kyle 2 ## 13: 5 E 2 5 8 6 Z M Kyle 2