2017-09-18 1 views
-1

Je suis bloqué sur un facile, mais n'a pas trouvé une solution dans le manuel data.table ou ici.data.table nombre de lignes indexées par catégorie

dt<-data.table(account=c("treu65","treu65","treg23","treg23","treg23"),year=c("2012","2013","2013","2013","2012")) 

Je dois ajouter une colonne avec un nombre de lignes par compte et par année. Le problème est que j'ai besoin de créer deux colonnes séparées. L'une contiendra le compte pour 2012, l'autre pour 2013. comme ceci:

account year count2012 count2013 
1: treu65 2012  1   1 
2: treu65 2013  1   1 
3: treg23 2013  1   2 
4: treg23 2013  1   2 
5: treg23 2012  1   2 

Normalement, j'agréger, mais dans ce cas je dois la même structure que ci-dessus. je suis arrivé aussi loin que:

dt[year==2012,count2012:=.N,.(account)] 
dt[year==2013,count2013:=.N,.(account)] 

Mais je NAs maintenant:

account year count2012 count2013 
1: treu65 2012   1  NA 
2: treu65 2013  NA   1 
3: treg23 2013  NA   2 
4: treg23 2013  NA   2 
5: treg23 2012   1  NA 

Et je devrais:

account year count2012 count2013 
1: treu65 2012   1   1 
2: treu65 2013   1   1 
3: treg23 2013   1   2 
4: treg23 2013   1   2 
5: treg23 2012   1   2 

Merci.

+0

Pourquoi 'count2013' obtient '1' à 'treu65 2012', mais' 2' à 'treg23 2012'? – PoGibas

+0

Parce qu'il y a 1 ligne avec compte == "treu65" & année == 2013, et 2 lignes avec compte == "treg23" & année == "2013". –

Répondre

2

Vous pouvez déplacer le filtre de i la position (par laquelle vous ne pourrez modifier des lignes spécifiques) à j position et utiliser sum compter les lignes:

dt[, `:=`(count2012 = sum(year == 2012), count2013 = sum(year == 2013)), .(account)][] 

# account year count2012 count2013 
#1: treu65 2012   1   1 
#2: treu65 2013   1   1 
#3: treg23 2013   1   2 
#4: treg23 2013   1   2 
#5: treg23 2012   1   2 
+1

Cela fonctionne, merci. Puis-je vous demander pourquoi l'opérateur: = est entre guillemets et quel est le but des crochets à la fin de l'expression? (encore en train d'apprendre ..) Merci encore –

+0

Neat! +1 Que diriez-vous de simplifier à '..., compte] []' au lieu de '...,. (Compte)] []' :-) – PoGibas

+0

': =' en ticks arrière est une façon standard d'écrire l'opérateur comme une fonction qui prend des paramètres dans r. Ceci n'est pas limité à ': =', par exemple vous pouvez aussi faire * \ '+ \' (3, 2) * pour * + *. Back ticks est utilisé ici car vous devez ajouter plusieurs colonnes; '[]' à la fin est uniquement à des fins d'impression, vous n'en avez pas réellement besoin. Puisque ': =' modifie data.table en place, par défaut, il n'imprime pas le résultat. – Psidom