如何根据帐户和时间间隔例如R中的上一天,上周,上个月等创建新功能?

如何解决如何根据帐户和时间间隔例如R中的上一天,上周,上个月等创建新功能?

PS:我的数据有100万行,所以我正在寻找一种不需要花费很长时间就可以运行大数据的解决方案。

这是我的交易数据

id          from    to          date        amount  
<int>       <fctr>  <fctr>      <date>      <dbl>
19521       6644    6934        2005-01-01  700.0
19524       6753    8456        2005-01-01  600.0
19523       9242    9333        2005-01-01  1000.0
19522       9843    9115        2005-01-01  900.0
19525       7075    6510        2005-02-01  400.0
19526       8685    7207        2005-02-01  1100.0
…           …       …           …           …
1052337     9866    5992        2010-12-31  139.1
1052768     9866    5797        2010-12-31  72.1
1054271     9866    6697        2010-12-31  95.8
1055597     9866    9736        2010-12-31  278.9
1053519     9868    8644        2010-12-31  242.8
1052790     9869    8399        2010-12-31  372.2

我想基于“来自”列中的帐户以及诸如上一天,上周,上个月之类的时间间隔来创建新功能

例如,我要计算在上一天/上周/上个月发送的“来自”列中帐户的最大金额,并将此信息另存为新列

以下数据是我期望的输出

id      from    to      date        amount  max_amount_in_last_day  max_amount_in_last_week max_amount_in_last_month    max_amount_in_last_3month
<int>   <fctr>  <fctr>  <date>      <dbl>   <dbl>                   <dbl>                  <dbl>                       <dbl>
19521   6644    6934    2005-01-01  700.0   700.0                   700.0                   700.0                       700.0
16214   6644    6874    2005-06-30  288.8   288.8                   288.8                   288.8                       288.8
16806   6644    9746    2005-06-30  83.7    288.8                   288.8                   288.8                       288.8
15220   6644    6671    2005-07-23  21716.0 21716.0                 21716.0                 21716.0                     21716.0
11975   6644    5384    2005-08-31  216.7   216.7                   216.7                   216.7                       21716.0
26579   6644    6041    2005-12-31  159.2   159.2                   159.2                   159.2                       159.2
35893   6644    8567    2006-01-31  169.6   169.6                   169.6                   169.6                       169.6
39425   6644    5599    2006-02-12  16230.0 16230.0                 16230.0                 16230.0                     16230.0
43606   6644    6454    2006-03-06  5859.0  5859.0                  5859.0                  16230.0                     16230.0
52052   6644    8836    2006-04-13  7269.0  7269.0                  7269.0                  7269.0                      16230.0
...

我该如何实现?

要计算max_amount_in_last_day,我尝试了以下代码,但在大型数据集上效果很差。有更好的方法吗?

y  <- NULL

for(i in data$id){
  
  date <- data[data$id==i,]$date
  
  acc <- data[data$id==i,]$from
  
  df <- data[data$from==acc & data$date==date,]
        
        df <- df %>% mutate(max_trx_amount_in_last_day=max(df$amount)) 

        tmp <- df
        y <- rbind(y,tmp) %>% distinct
        

}

y

解决方法

首先,定义一个函数以计算您希望在前几天内获得的统计信息。

previousDays <- function(X,from,date,days,FUN){
  FUN <- match.fun(FUN)
  Y <- X[X[['from']] == from,]
  i <- Y[['date']] >= date - days + 1 & Y[['date']] <= date
  if(sum(i) > 0) FUN(Y[i,'amount']) else NA_real_
}

现在,按指定的天数将函数应用于每一行。在以下情况下,7天,即最后一周。

applyPrev <- function(X,FUN){
  FUN <- match.fun(FUN)
  sapply(seq_along(X[['id']]),function(i){
    f <- X[i,'from']
    d <- X[i,'date']
    previousDays(df1,f,d,FUN)
  })
}

applyPrev(df1,7,max)

数据

df1 <- read.table(text = "
id          from    to          date        amount  
19521       6644    6934        2005-01-01  700.0
19524       6753    8456        2005-01-01  600.0
19523       9242    9333        2005-01-01  1000.0
19522       9843    9115        2005-01-01  900.0
19525       7075    6510        2005-02-01  400.0
19526       8685    7207        2005-02-01  1100.0
1052337     9866    5992        2010-12-31  139.1
1052768     9866    5797        2010-12-31  72.1
1054271     9866    6697        2010-12-31  95.8
1055597     9866    9736        2010-12-31  278.9
1053519     9868    8644        2010-12-31  242.8
1052790     9869    8399        2010-12-31  372.2
",header = TRUE)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?