2016-07-31 79 views
0

我有一个销售数据框,其中有1列的日期分布在至少3年,CustomerId,交易和交易金额。找到对R中的另一列重复的列值

 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 

我试图找回Cust.ID谁购买超过2年,在这种情况下将是1?

我试过使用Duplicated函数,但它删除了原始值。

我真的开始在R,如果有人分享他们的方法将不胜感激。

+0

喔,它代表了这是在Cust.ID这里拍摄的员工,让我编辑 –

+0

因此,如果客户购买了2013年和2015年,他们会被列入? – zx8754

+0

客户如何购买2013年12月和2014年1月? '谁已经购买了2年以上' - 并不是很清楚。 – zx8754

回答

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 
+0

感谢您的回答,我使用rowSums,问题是如果客户2013年三次和一次在2013年进行了一次交易,那么总和将为4,但是有没有办法可以找到客户是否改变了年? –

+0

你检查标签!= 0吗?你应该检查,然后行总和。 – Psidom

+0

是的,你是对的,我对2年内分散的人会得到“真”假,请你解释一下tab!= 0是什么意思?另外,当我将rowSums(tab!= 0)> = 2传递给数据框以选择分布在不同年份的记录时,我还可以检索一年内散布的数据以及任何想法? –

0

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df)),按'Cust.ID'分组,我们将'Date'转换为Date类,提取'Year'和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 
相关问题