【问题标题】:Getting rid of wash out rows in R dataframe by group逐组清除 R 数据帧中的行
【发布时间】:2015-06-30 17:20:02
【问题描述】:

这是我的数据框的样子:

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(约翰在 3 月份的情况)。但我也可以接受在 2015 年 3 月 2 日或 2015 年 3 月 5 日给我两个 2000 的输出。非常感谢您的帮助!

【问题讨论】:

    标签: r dataframe data.table dplyr zoo


    【解决方案1】:

    这就是我要做的,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
    

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

    【讨论】:

    • John 2000 应该有两个条目
    • @docendodiscimus 哦,你是对的。不知道如何得到那个......思考。
    • @PierreLafortune 谢谢,已修复
    • 这两列似乎是所需输出的混合。一些 activesal 应该在 transval 中,反之亦然
    • @Frank 采用了不同的方法,因为我没有捕获日期。不过好主意!
    【解决方案2】:

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

    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
    #> ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-13
      • 2023-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-24
      相关资源
      最近更新 更多