Je traite maintenant d'une table en R comme suit:

A B 09-2016
B A 09-2016
A C 10-2016
C A 11-2016
A B 12-2016

J'ai essayé de compter le nombre d'occurrences des mêmes valeurs de ligne dans les deux premières colonnes, par exemple, "A B" apparaît deux fois dans le tableau, et j'utilise le code R suivant:

library(data.table)
dt = data.table(data)
dt[, list(Freq =.N, V3), by=list(V1,V2)]

Et je peux obtenir la sortie suivante:

A B 2 09-2016
B A 1 09-2016
A C 1 10-2016
C A 1 11-2016
A B 2 12-2016

Maintenant, je veux compter l'occurrence du motif inverse , par exemple, "A B" et "B A", comme la même valeur et obtenir le résultat suivant:

A B 3 09-2016
B A 3 09-2016
A C 2 10-2016
C A 2 11-2016
A B 3 12-2016

Ma question est la suivante: comment puis-je modifier le code ci-dessus pour traiter ce cas? Ou y a-t-il un autre moyen? THX.

2
Frown 20 avril 2017 à 23:08

3 réponses

Meilleure réponse

Voici une tentative en utilisant pmin et pmax pour coller les deux colonnes triées.

library(data.table)

dt[, freq := .N, by = .(new = paste(pmin(V1, V2), pmax(V1, V2)))][]

#   V1 V2 V3      V4 freq
#1:  A  B  2 09-2016    3
#2:  B  A  1 09-2016    3
#3:  A  C  1 10-2016    2
#4:  C  A  1 11-2016    2
#5:  A  B  2 12-2016    3
1
Sotos 20 avril 2017 à 21:31

Vous pouvez sélectionner les max et min des 2 colonnes V1, V2 initialement et group by ces valeurs de manière à résumer une fréquence de paire symétrique.

dt<-dt[,.(mx=max(as.character(V1),as.character(V2)),mn=min(as.character(V1),as.character(V2)))
       ,by=.(V1,V2,V3)]
dt<-dt[,.(Freq =.N,V1,V2,V3), by=.(mx,mn)][,.(V1,V2,V3,Freq)]
dt

R-Fiddle

1
Vamsi Prabhala 20 avril 2017 à 21:14
library(data.table)
dt <- data.table(V1 = c("A", "B", "A", "C", "A"),
    V2 = c("B", "A", "C", "A", "B"),
    V3 = c("09-2016", "09-2016", "10-2016", "11-2016", "12-2016"))
dt[, tempvar := paste0(sort(c(V1,V2)), collapse = ""), by = 1:nrow(dt)]    
dt[, freq := .N, by = tempvar][, tempvar:=NULL]
3
989 20 avril 2017 à 20:53