我有一个销售数据框,其中我的日期为1列,至少3年,CustomerId,交易和交易金额。
Date Cust.ID Transact.Amt
12-Aug-2013 1 64
12-Aug-2014 1 154
15-Dec-2013 2 85
17-Dec-2013 1 135
我正在尝试检索已购买超过2年的Cust.ID
,在这种情况下会是1?
我尝试使用重复功能,但它删除了原始值。
我真的是在R开始,如果有人分享他们的方法,我将不胜感激。
答案 0 :(得分:1)
这是一个使用table
查看每个客户每年交易的次数,并检查每个客户实际交易的年数并指定您希望为每个客户检查的阈值的选项:
library(lubridate)
tab <- table(df$Cust.ID, year(dmy(df$Date)))
tab
# 2013 2014
# 1 2 1
# 2 1 0
rowSums(tab != 0) >= 2
# 1 2
# TRUE FALSE
另一个dplyr
选项:
library(dplyr); library(lubridate)
df %>%
group_by(Cust.ID) %>%
summarise(n_years = n_distinct(year(dmy(Date)))) %>%
filter(n_years >= 2)
# A tibble: 1 x 2
# Cust.ID n_years
# <chr> <int>
#1 1 2
原始数据框子集的更新:
df %>%
group_by(Cust.ID) %>%
filter(n_distinct(year(dmy(Date))) >= 2)
#Source: local data frame [3 x 3]
#Groups: Cust.ID [1]
# Date Cust.ID Transact.Amt
# <chr> <chr> <chr>
# 1 12-Aug-2013 1 64
# 2 12-Aug-2014 1 154
# 3 17-Dec-2013 1 135
答案 1 :(得分:0)
我们可以使用data.table
。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(df)
),按&#39; Cust.ID&#39;分组,我们将&#39;日期&#39;到Date
课程,提取“年”&#39; if
unique
个元素的长度大于1,我们得到Data.table的子集。
library(data.table)
setDT(df)[, if(uniqueN(format(as.Date(Date, "%d-%b-%Y"), "%Y"))>1) .SD, by = Cust.ID]
# Cust.ID Date Transact.Amt
#1: 1 12-Aug-2013 64
#2: 1 12-Aug-2014 154
#3: 1 17-Dec-2013 135