2016-07-31 3 views
0

wiederholt wird Ich habe einen Verkaufsdatenrahmen, wo ich Daten in 1 Spalte, die über mindestens 3 Jahre, CustomerId, Transaktion und Transaktionsbetrag verteilt ist.Finden Sie einen Spaltenwert, der gegen eine andere Spalte in 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 

Ich versuche Cust.ID abzurufen, die mehr als 2 Jahre gekauft haben, 1 die in diesem Fall sein?

Ich versuchte mit der Funktion Duplicated, aber es entfernte die ursprünglichen Werte.

Ich beginne wirklich in R, würde mich freuen, wenn jemand ihren Ansatz teilt.

+0

ohh, es steht für Mitarbeiter, die hier in Cust.ID erfasst wird, lassen Sie mich es bearbeiten –

+0

Also, wenn Kunden gekauft 2013 und 2015 würden sie aufgenommen werden? – zx8754

+0

Wie wäre es mit Kunden gekauft 2013Dezember und 2014Januar? "Wer hat über 2 Jahre gekauft" - ist nicht sehr klar. – zx8754

Antwort

1

Hier ist eine Option table, um herauszufinden, mit wie viele Transaktionen pro Kunde für jedes Jahr gemacht hat, und überprüfen, wie viele Jahre jede Kundentransaktionen tatsächlich und Schwellen geben Sie möchten für jeden Kunden überprüfen:

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 

Eine weitere dplyr Option:

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 

aktualisieren für Originaldatenrahmen subsetting:

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

Danke für die Antwort, wann Ich verwende rowsSums, das Problem ist, dass, wenn ein Kunde in einem Jahr 2013 dreimal und einmal im Jahr 2014 gehandelt hat, dann wird die Summe 4 sein, aber gibt es eine Möglichkeit, die ich finden kann, wenn der Kunde das Jahr geändert hat? –

+0

Haben Sie Tab! = 0 überprüft? Sie sollten das überprüfen und dann die Summe addieren. – Psidom

+0

Ja, du hast recht, ich bekomme WAHRE FALSCH für Leute, die über 2 Jahre verteilt sind, könntest du bitte erklären, was tab! = 0 bedeutet? Auch wenn ich die rowsSums (tab! = 0)> = 2 an den Datenframe übergebe, um die Datensätze auszuwählen, die über verschiedene Jahre verteilt sind, erhalte ich auch Daten, die in einem einzigen Jahr verteilt sind, irgendwelche Gedanken? –

0

Wir können data.table verwenden. Konvertieren Sie 'data.frame' in 'data.table' (setDT(df)), gruppiert nach 'Cust.ID', konvertieren wir das 'Date' in Date Klasse, extrahieren Sie das 'Jahr' und if die Länge von unique Elemente sind größer als 1, erhalten wir die Subset von 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 
Verwandte Themen