摆脱R数据帧中的行清除

gib*_*z00 3 r dataframe zoo dplyr data.table

这就是我的数据框架:

df <- read.table(text='
    CustomerName    Sales          TradeDate
    John           1000              1/1/2015
    John          -1000              1/1/2015
    John           1000              1/1/2015
    John           5000              2/1/2015
    John          -2000              3/1/2015
    John           2000              3/2/2015
    John           2000              3/3/2015
    John          -2000              3/4/2015
    John           2000              3/5/2015
    John           2000              3/6/2015
    John          -3000              4/1/2015
    John           3000              4/1/2015
    John          -3000              4/1/2015
    John           2000              5/1/2015
    John          -2000              5/1/2015
    John           2000              5/1/2015
    Tom            1000              1/1/2015
    Tom           -1000              1/1/2015
    Tom            1000              1/1/2015
    Tom            5000              2/1/2015
    Tom           -2000              3/1/2015
    Tom            2000              3/1/2015
    Tom           -2000              3/1/2015
    Tom            2000              3/1/2015
    Tom            2000              3/1/2015
    Tom           -3000              4/1/2015
    Tom            3000              4/1/2015
    Tom           -3000              4/1/2015
                                             ', header=T)
Run Code Online (Sandbox Code Playgroud)

我想摆脱金额相等且符号相反的所有销售额(+, - ),并且只显示剩余的净销售额(最好是在最早的日期,但无论哪种方式都无关紧要).我想要的数据框看起来像这样

CustomerName    Sales   TradeDate
John            1000    1/1/2015
John            5000    2/1/2015
John            2000    3/3/2015
John            2000    3/6/2015
John           -3000    4/1/2015
John            2000    5/1/2015
Tom             1000    1/1/2015
Tom             5000    2/1/2015
Tom             2000    3/1/2015
Tom            -3000    4/1/2015
Run Code Online (Sandbox Code Playgroud)

2015年3月3日和2015年3月6日,我选择了两个2000年(约翰在3月份的案例中).但我也可以在2015年3月2日或2015年5月5日给出两个2000s的输出.非常感谢您的帮助!

Fra*_*ank 5

这是我要做的,在data.table:

library(data.table)

# identify how many transactions we need to keep
setDT(df)[,
    n_keep := sum(Sales)/transval
,by=.(CustomerName,transval=abs(Sales))]

# tag those transactions
df[sign(Sales)==sign(n_keep),
    keep := 1:.N %in% tail(1:.N,abs(n_keep[1]))
,by=.(CustomerName,Sales)]

# keep 'em
df[(keep)][,c("n_keep","keep"):=NULL][]
Run Code Online (Sandbox Code Playgroud)

这使

   CustomerName Sales TradeDate
1:         John  1000  1/1/2015
2:         John  5000  2/1/2015
3:         John  2000  3/5/2015
4:         John  2000  3/6/2015
5:         John -3000  4/1/2015
6:          Tom  1000  1/1/2015
7:          Tom  5000  2/1/2015
8:          Tom  2000  3/1/2015
9:          Tom -3000  4/1/2015
Run Code Online (Sandbox Code Playgroud)

我确信我的代码可以简化,但我认为这些步骤非常透明.

  • @Frank因为我没有捕捉日期而采用了不同的方法.不过好主意! (2认同)