Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 基于过滤条件提取原始数据_R - Fatal编程技术网

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
    时,您将得到更具代表性的结果。作为演示,我将从_id
    s调整几个
    ,以便有一些通用性

    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)