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.
3 Réponses :
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 ...
dt1[,paste(sort(c(CAT1,CAT2)),collapse=" & "),by=1:nrow(dt1)][,table(V1)]
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.
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