按组清除 R 数据框中的行
Getting rid of wash out rows in R dataframe by group
这是我的数据框的样子:
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)
我想去掉所有数量相等、符号相反(+,-)的Sales,只显示剩余的净Sales(最好是最早的日期,但不管怎样都无所谓) .我想要的数据框如下所示
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 的输出。非常感谢您的帮助!
这是我在 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
我确定我的代码可以简化,但我认为这些步骤非常透明。
另一种解决方案是只计算每日总计:
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
#> ...
这是我的数据框的样子:
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)
我想去掉所有数量相等、符号相反(+,-)的Sales,只显示剩余的净Sales(最好是最早的日期,但不管怎样都无所谓) .我想要的数据框如下所示
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 的输出。非常感谢您的帮助!
这是我在 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
我确定我的代码可以简化,但我认为这些步骤非常透明。
另一种解决方案是只计算每日总计:
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
#> ...