2016-07-31 77 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 
相關問題