2017-03-03 5 views
-1

Ich habe einen Datensatz mit mehreren überlappenden Kriterien und deren Häufigkeit des Auftretens. Ich möchte Daten als ein Netzwerk (Akkord) Diagramm mit dem R circlize Paket plotten. Ich habe versucht, die Daten ohne Erfolg in eine Adjazenzmatrix zu konvertieren. Ich könnte die Beobachtungen, die paarweise als Matrix auftreten, umwandeln. Allerdings kann ich es nicht tun, wenn mehr als zwei Kriterien zusammen sind. Der Datensatz kann here zugegriffen werden:Konvertiere einen Datenrahmen in Adjazenzmatrix in R

Die Daten sieht wie folgt aus

criteria criteria1 criteria2 criteria3 criteria3 Frequency 
None     151 
G     121 
BH     108 
KBA     4 
IBA KBA    172 
AZE KBA    1 
AZE IBA KBA   3 
G KBA    6 
G IBA KBA   129 
G AZE KBA   3 
G AZE KBA IBA  7 
BH KBA    7 
BH IBA KBA   121 
BH AZE KBA   6 
BH AZE IBA KBA  15 
BH G    153 
BH G KBA   32 
BH G IBA KBA  200 
BH G AZE   5 
BH G AZE KBA  4 
BH G AZE IBA KBA 44 
+0

Wenn es mehr als zwei Kriterien gibt, halten Sie jede Paarkombination für eine Kante? – Marcelo

+0

Marcelo, Ja! Jedes Paar würde als eine Kante betrachtet werden. – Arihant

Antwort

1

Sie haben für die Zeilen alle Paarkombinationen zu bekommen, wo Sie mehr als ein Kriterium haben und die Frequenz zuweisen. Dann sind Sie die Frequenzen der gleichen Kanten summieren Hier ist der Code:

require(dplyr) 

#Helper fucntion to get pairwise conbinations of criteria 
getEdges <- function(x) 
{ 
     # simplify the list 
     v<-unlist(x); 

     #Get the pairs and create a dataframe with the frequencies 
     cb<-combn(v[1:length(v)-1],2, simplify=F); 
     df<-data.frame(matrix(unlist(cb),ncol=2,byrow=T),frequency=as.integer(v[length(v)]),stringsAsFactors=F); 

     return (df) 
} 

#Get the pairs 
edges <- lapply(split(df, seq(nrow(df))), getEdges) 

#join the list into one dataframe 
edges<-bind_rows(edges) 

#Remove empty source and destination 
edges <-edges[edges$X1!=""&edges$X2!="",] 

#aggregate on edges 
aggr <- aggregate(edges$frequency,by=list(edges$X1,edges$X2), FUN=sum) 

Dataframe aggr ist die Liste der Kanten.

+0

Marcelo, Danke! Nach dem Zeichnen des Akkorddiagramms sehen die Zahlen sehr hoch aus, und ich stelle fest, dass die Paare nicht als Kante betrachtet werden können. Die Gesamtzahl der Beobachtungen (Summe der Häufigkeit) darf 1292 nicht überschreiten. – Arihant

Verwandte Themen