R 基于过滤条件提取原始数据
这是我的交易数据:R 基于过滤条件提取原始数据,r,R,这是我的交易数据: id from_id to_id amount date_trx <fctr> <fctr> <fctr> <dbl> <date> 0 7468 5695 700.0 2005-01-04 1 6213 9379 1
id from_id to_id amount date_trx
<fctr> <fctr> <fctr> <dbl> <date>
0 7468 5695 700.0 2005-01-04
1 6213 9379 11832.0 2005-01-08
2 7517 8170 1000.0 2005-01-10
3 6143 9845 4276.0 2005-01-12
4 6254 9640 200.0 2005-01-14
5 6669 5815 200.0 2005-01-20
6 6934 8583 49752.0 2005-01-24
7 9240 8314 19961.0 2005-01-26
8 6374 8865 1000.0 2005-01-30
9 6143 6530 13.4 2005-01-31
...
我所做的是每周对数据进行排序,这样我就可以看到每个账户每周的交易总额,然后得到仅高于某个值的数据,在我的例子中,该值为1000
我得到了以下信息:
date_trx from_id amount
<date> <fctr> <dbl>
2005-01-02 5773 7174.0
2005-01-02 6213 12032.0
2005-01-02 6375 3742.0
2005-01-02 6510 5698.0
2005-01-02 6727 5923.0
2005-01-02 7047 1100.0
2005-01-02 7207 1100.0
2005-01-02 9440 1100.0
2005-01-02 9493 4201.0
2005-01-09 5997 5209.0
...
date\u trx from\u id金额
2005-01-02 5773 7174.0
2005-01-02 6213 12032.0
2005-01-02 6375 3742.0
2005-01-02 6510 5698.0
2005-01-02 6727 5923.0
2005-01-02 7047 1100.0
2005-01-02 7207 1100.0
2005-01-02 9440 1100.0
2005-01-02 9493 4201.0
2005-01-09 5997 5209.0
...
现在,我想得到满足上述过滤条件的原始数据。我该怎么做?为了更清楚,让我们把5773考虑在内。我们知道,对于5773,2005-01-02年内的总交易金额为7174.0,因此该金额高于阈值1000,因此我保留该账户。但在以这种方式过滤之后,我只想提取总计为7174.0的单个事务。这里有一种方法
week\u trx
作为日期的下限,而不是替换date\u trx
。在汇总之前也要这样做,因为我们将使用它将数据连接回汇总
sum\u amount
,以便我们可以轻松地将原始/单个金额
与合计金额区分开来。(当然,我们不需要这个步骤就可以很容易地将它们区分开来,但是您会有名称amount.x
和amount.y
,这对我来说不太直观。)dat%
汇总(总和金额=总和(金额))%>%
过滤器(总和>1000)%>%
解组()
datsumm
##tibble:4 x 3
#周\u trx自\u id总和\u金额
#
# 1 2005-01-02 6213 11832
# 2 2005-01-09 6143 4276
# 3 2005-01-23 6934 49752
# 4 2005-01-23 9240 19961
左连接(datsumm,dat,by=c(“星期trx”,“起始id”))
##A tibble:4 x 7
#周\u trx从\u id sum \u amount id到\u id amount date \u trx
#
# 1 2005-01-02 6213 11832 1 9379 11832 2005-01-08
# 2 2005-01-09 6143 4276 3 9845 4276 2005-01-12
# 3 2005-01-23 6934 49752 6 8583 49752 2005-01-24
# 4 2005-01-23 9240 19961 7 8314 19961 2005-01-26
在这个示例中,summary中有四行,rejoined表中有四行,但是当每个都有一行以上来自\u id
时,您将得到更具代表性的结果。作为演示,我将从_ids调整几个,以便有一些通用性
set.seed(4)
dat2%
变异(from_id=sample(head(from_id,3),size=n(),replace=TRUE))
DAT2%
分组依据(周trx,从id开始)%>%
汇总(总和金额=总和(金额))%>%
过滤器(总和>1000)%>%
解组()
datsumm2
##tibble:3 x 3
#周\u trx自\u id总和\u金额
#
# 1 2005-01-02 7468 11832
# 2 2005-01-09 7468 5276
# 3 2005-01-23 7517 69713
左连接(datsumm2,dat2,by=c(“星期trx”,“从id”))
##A tibble:5 x 7
#周\u trx从\u id sum \u amount id到\u id amount date \u trx
#
# 1 2005-01-02 7468 11832 1 9379 11832 2005-01-08
# 2 2005-01-09 7468 5276 2 8170 1000 2005-01-10
# 3 2005-01-09 7468 5276 3 9845 4276 2005-01-12
# 4 2005-01-23 7517 69713 6 8583 49752 2005-01-24
# 5 2005-01-23 7517 69713 7 8314 19961 2005-01-26
数据:
dat我们不需要总结
,只需在分组后过滤
,然后删除创建的临时列。请注意,tidyverse
中的许多函数都可以在不创建列的情况下动态进行计算(sum(amount)
)
library(dplyr)
library(lubridate)
data %>%
group_by(date_trx_week =floor_date(date_trx, "week"),from_id) %>%
filter(sum(amount) > 1000) %>%
ungroup %>%
select(-date_trx_week)
如果您需要原始的过滤器ed数据,则不要汇总即数据%>%group\u by(date\u trx\u week=floor\u date(date\u trx,“week”),from\u id)%%>%filter(sum(amount)>1000)%%>%ungroup%%选择(-date trx\u week)
如果输入示例显示了预期的输出,那会很有帮助。我想您得到的输出是基于整个数据的。请显示您在Input中显示的行的预期输出。您的解决方案为我提供了实际需要的输出。谢谢@akrun
library(dplyr)
library(lubridate)
data %>%
group_by(date_trx_week =floor_date(date_trx, "week"),from_id) %>%
filter(sum(amount) > 1000) %>%
ungroup %>%
select(-date_trx_week)