R

时间:2017-11-17 19:55:34

标签: r date dataframe grouping

所以这是我正在使用的数据框

CAND_NAME   TRANSACTION_DT   TRANSACTION_AMT
K            10312017            100 
K            11032017            500
K            11032017            100 
K            11102017            200 
K            11112017            200 
R            11032016            200 
R            11032017            100 
R            11042017            500 

我想将候选人的TRANSACTION_DT分组为7天。换句话说,10292017(或10/29/2017),10302017,10312017,11012017,11022017,11032017和11042017将被分组,并且该组的交易金额将被总结。

我想要这个:

CAND_NAME   TRANSACTION_WK_START   TRANSACTION_AMT
K            10292017            700 
K            11052017            400 
R            10302016            200 
R            10292017            600 

注意R,日期11032016和11032017是不同的,我不希望它们组合在一起。

到目前为止我已经

df.new <- df %>%
  group_by(TRANSACTION_DT,CAND_NAME) %>%
  summarize(TRANSACTION_AMT = sum(TRANSACTION_AMT))

1 个答案:

答案 0 :(得分:1)

这是一个潜在的解决方案。将Transaction_dt转换为日期,然后创建一个周序列。在这种情况下,我使用的是数据中最早的日期。这可能是一个问题,因为它可能不会在本周初开始。如果是这样,那么定义从已知可接受的开始开始的顺序就是一个问题。然后,这只是一个剪切和分组的问题。

df<-structure(list(CAND_NAME = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 
            2L, 2L), .Label = c("K", "R"), class = "factor"), TRANSACTION_DT = c(10312017L, 
             11032017L, 11032017L, 11102017L, 11112017L, 11032016L, 11032017L, 
             11042017L), TRANSACTION_AMT = c(100L, 500L, 100L, 200L, 200L, 
              200L, 100L, 500L)), .Names = c("CAND_NAME", "TRANSACTION_DT", 
              "TRANSACTION_AMT"), class = "data.frame", row.names = c(NA, -8L))

#convert to dates
df$date<-as.Date(as.character(df$TRANSACTION_DT), format="%m%d%Y")
#define the breaks
breaks<-seq(from=min(df$date), to=max(df$date)+7, by = "week")
#define the cut points
df$breaks<-cut(df$date, breaks)

library(dplyr)
df %>%
  group_by(breaks,CAND_NAME) %>%
  summarize(TRANSACTION_AMT = sum(TRANSACTION_AMT))



#     breaks CAND_NAME TRANSACTION_AMT
#      <fctr>    <fctr>           <int>
#1 2016-11-03         R             200
#2 2017-10-26         K             100
#3 2017-11-02         K             600
#4 2017-11-02         R             600
#5 2017-11-09         K             400