按组去除R数据框中的空白行

3
这是我的数据框的样子:
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)

我想要去除所有金额相等且正负相反的销售,并仅显示剩余的净销售额(最好是在最早日期,但无论如何都没有关系)。我的期望数据框长这样。
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

我选择了从2015年3月3日到2015年3月6日期间的两个2000元(在John的情况下是在三月份),但如果输出为2015年3月2日或2015年3月5日的两个2000元,我也可以接受。非常感谢您的帮助!

2个回答

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][]

这提供了

   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

我相信我的代码可以简化,但我认为步骤非常清晰。


约翰2000应该有两个条目。 - Pierre L
@docendodiscimus 哦,你说得对。不确定该怎么得到那个...思考中。 - Frank
在这种情况下,“activesal”不是输出,因为存在两个4000值。 - Pierre L
2
@Frank采用了不同的方法,因为我没有捕获日期。不过这是个好主意! - Frank
@gibbz00 你可以尝试并查看。我认为代码的功能相当透明(计算最终有多少条净销售记录;然后选择最近的 n 条带有正确符号的记录)。如果您希望它以不同的方式运作(我可以想象出这种情况),则必须修改代码或选择不同的方法。 - Frank
显示剩余6条评论

1

另一种解决方案是仅计算每日总数:

library(dplyr)
df %>%
  group_by(CustomerName, TradeDate) %>%
  summarise(Sales = sum(Sales))
#> Source: local data frame [14 x 3]
#> Groups: CustomerName
#> 
#>    CustomerName TradeDate Sales
#> 1          John  1/1/2015  1000
#> 2          John  2/1/2015  5000
#> 3          John  3/1/2015 -2000
#> 4          John  3/2/2015  2000
#> 5          John  3/3/2015  2000
#> 6          John  3/4/2015 -2000
#> ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接