2017-03-22 2 views
0

J'ai récemment fait ce post sur le même problème en Python, je suis intéressé de voir quelles options peuvent être disponibles dans R. Je me demande si R a des paquets qui pourrait rendre cela un peu plus facile. Disons que j'ai des données client sur certaines dates et je veux voir si par exemple leur adresse a changé. Au cours de ces dates. Idéalement, je voudrais copier les deux colonnes où les changements se sont produits dans une nouvelle table ou simplement obtenir une mesure pour le montant total des changements.Comment dire si une valeur a changé sur les dimensions dans R

Donc, si j'avais une table comme

Date , Customer , Address 
12/31/14, Cust1, 12 Rocky Hill Rd 
12/31/15, Cust1, 12 Rocky Hill Rd 
12/31/16, Cust1, 14 Rocky Hill Rd 
12/31/14, Cust2, 12 Testing Rd 
12/31/15, Cust2, 12 Testing Ln 
12/31/16, Cust2, 12 Testing Rd 

Je finirais avec un compte de deux changements, le changement du client 1 between12 Rocky Hill Rd entre 31/12/15 et 31/12/16 et Changement de Cust2 entre 31/12/14 et 31/12/15.

Idéalement je pourrais obtenir une table comme celui-ci

Dates , Customer , Change 
12/31/15 to 12/31/16, Cust1, 12 Rocky Hill Rd to 14 Rocky Hill Rd 
12/31/14 to 12/31/15, Cust2, 12 Testing Rd to 12 Testing Ln 

Ou même un nombre total de changements serait génial. Des idées? Idéalement, j'aurais d'autres dates, éventuellement de multiples changements entre ces dates, et potentiellement des colonnes supplémentaires que j'aimerais vérifier pour les changements aussi. Vraiment, juste une somme de changements à un enregistrement client sur une période de temps pour chaque colonne suffirait.

Répondre

2

Vous pouvez utiliser group_by et summarise dans dplyr pour obtenir la plage de dates et le nombre de modifications sous forme de colonnes dans une nouvelle table:

library(dplyr) 
df %>% 
    group_by(Customer) %>% 
    summarise(dates = sprintf("%s to %s", min(Date), max(Date)), 
      change.count = length(unique(Address)) - 1) 

Résultat:

# A tibble: 2 × 3 
    Customer    dates change.count 
    <chr>    <chr>  <dbl> 
1 Cust1 12/31/14 to 12/31/16   1 
2 Cust2 12/31/14 to 12/31/16   1 
+0

Toute réflexion sur la façon dont nous pourrions développer cette solution pour tenir compte des changements d'adresse multiples à des dates différentes? Je pense que la solution proposée fournira une colonne de dates des dates min et max dans l'ensemble de données (et des adresses uniques pour tenir compte de tout changement), mais si j'avais 20 lignes représentant chacune l'adresse à une date précise, je voudrais savoir quelle était l'adresse avant un changement et à quoi il a été changé. De cette façon je sais que l'adresse était statique pour dire 4 dates, puis changée quelque part entre les 5ème et 6ème dates et ainsi de suite ... Des idées? – sc305495

1

Pour un nombre total d'adresses, vous pouvez simplement agréger par ID client.

aggregate(Data$Address, by=list(Data$Customer), function(x) length(unique(x))) 
    Group.1 x 
1 Cust1 2 
2 Cust2 2 

Ceci est le nombre d'adresses. Pour obtenir le nombre de changements soustraire un.