1
votes

Comment compter les combinaisons uniques à partir d'une table de données dans R?

J'ai un tableau de données avec trois colonnes. Les deux premiers sont une collection de points de données (données catégorielles qui peuvent être A, B ou C). La troisième colonne est une concaténation des deux points de données car ils appartiennent à un ensemble. J'ai besoin d'obtenir le décompte des combinaisons possibles et de compter "A & C" comme faisant partie du même groupe que "C & A" car l'ordre de ces paires n'a pas d'importance.

Auparavant, je configurais une colonne qui concaténait "CAT1 & CAT2" puis une autre en tant que "CAT2 & CAT1" dans l'espoir de résumer là-bas, mais ces nombres ne s'additionnent bien sûr pas correctement.

library(data.table)
dt1 = data.table(CAT1 = c('a','b','c','b','a','c','c','b','a','c'),
                 CAT2 = c('a','b','c','a','b','c','a','b','c','a'))

dt1[,merged := paste(dt1$CAT1, dt1$CAT2, sep = ' & ')]

counts = data.table(table(dt1$merged))

La table de sortie "compte" me donne tous les uniques de la colonne fusionnée, mais je dois résumer partout où les points de données sont retournés ("A & C" + "CALIFORNIE"). Je reconnais que cela pourrait être fait manuellement, mais j'ai beaucoup trop de points de données réels à faire à la main.


0 commentaires

3 Réponses :


0
votes

Je ne suis pas bon avec data.table, alors voici ma réponse avec un data.frame:

Triez simplement les deux CAT avant de coller, en vous assurant qu'ils sont toujours dans le même ordre.

< pre> XXX

Je suis sûr qu'il existe un moyen plus rapide de faire avec data.table, mais je ne sais pas comment. Un tri naïf ajouté à votre code a généré une erreur ...


0 commentaires

1
votes
dt1[,paste(sort(c(CAT1,CAT2)),collapse=" & "),by=1:nrow(dt1)][,table(V1)]

2 commentaires

autre possibilité: dt1 [ table (coller (pmin (CAT1, CAT2), pmax (CAT1, CAT2), sep = '&'))]


Cela pourrait être évident pour certains, mais pour que cette réponse fonctionne, la classe doit être composée de personnages. Je l'ai essayé avec des facteurs sans le savoir et a échoué lamentablement jusqu'à ce qu'il soit défini sur des personnages. Merci encore.



1
votes

Vous pouvez également faire quelque chose comme ceci- Remarque - Comme mentionné par @ chinsoon12, nous pouvons utiliser pmin & pmax

 > setDT(dt1)[,list(Count=.N) ,paste(pmin(CAT1, CAT2), pmax(CAT1, CAT2), sep=' & ')]
   paste Count
1: a & a     1
2: b & b     2
3: c & c     2
4: a & b     2
5: a & c     3


0 commentaires