所以这是我正在使用的数据框
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))
答案 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