2016-05-15 5 views
4

Ich versuche, eine CSV mit 3 Spalten zu einem Arcplot zu konvertieren. Die Spalten - A, B, C gehen immer in der Reihenfolge A ->B ->C. Allerdings sah ich keinen Weg, dies als ein Diagramm zu realisieren, da es schien, dass die meisten Ansätze einen Zwei-Spalten-Kanten-Plot verwendeten. Folglich habe ich die Anweisungen here zur Umwandlung in eine Adjazenzmatrix verfolgt.3 Spalten CSV, zu Adjazenz-Matrix, zu Networkgraph, zu Arcplot

Ich werde das Problem unten neu erstellen - aber keine falschen Daten generieren, als eine Sorge ist, dass die CSV möglicherweise nicht richtig eingelesen werden.

Grundsätzlich enthält der CSV Zeilen, wobei jede Spalte durch einen , getrennt ist, kann jedoch durch ; wie mehrere Werte getrennt enthalten:

ENV;MO,echoic;tact,social 
ENV;MO,mand,physical 
OVB,intraverbal,social 
ENV;OVB,tact,social 
OVB,intraverbal;tact,social 
OVB;ENV;MO,intraverbal;mand,social 
OVB;ENV;MO,intraverbal;mand,physical;social 
ENV;MO,mand,social;physical 

Ich versuche, die folgende, um zu erreichen, einige Netzwerkgraphik vor dem Umzug in den Bogen:

options(stringsAsFactors = F) 
lst <- read.csv("abc.csv", header=FALSE) 

#this is pretty much straight from the link above 
d <- do.call(rbind, lst) 
edges <- rbind(d[ ,1:2], d[ ,2:3]) 
g <- graph.data.frame(edges, directed=TRUE) 
adj <- as.matrix(get.adjacency(g)) 
g2 <- new("graphAM", adjMat=adj, edgemode="directed") 
plot(g2, attrs = list(graph = list(rankdir="LR"), node = list(fillcolor = "lightblue"))) 

Das Ergebnis ist so ziemlich gar nicht was ich hatte gehofft. Anstelle von Elementen aus Spalte A, die auf B zeigen, zeigen sie auf C. Vielmehr ist es nur ein Element von A, das auf sich selbst zeigt; eine von B, die auf eine andere zeigt, die auf eine andere zeigt, z. B. intraverbal ->mand ->intraverbal; tact, und eine von C zeigt auf sich selbst und einen anderen Wert von C.

Nachtrag: das A Gegeben ->B ->C Format, eine Zeile wie

OVB; ENV, MO, Intra; mand, soziale

bezeichnet

A (OVB & ENV & MO) -> B (intraverbal & mand) -> C (sozial)

Obwohl es den Umfang der Frage nicht übersteigen, wäre das Ende Ziel bogen Graphen ähnlich denen hier dargestellt sein PDF guide to arcplots in R

+1

aboutn die mehrere Werte getrennt durch Nicht sicher "" ... zum Beispiel sollte die erste Zeile werden: 'ENV-> echoic-> Sozial + ENV-> tact-> sozial + MO-> echotisch-> sozial + MO-> takt-> sozial 'ist es richtig? – digEmAll

+0

Es sollte ENV/MO -> Echo/Takt -> soziale Die A-Spalte hat eine Kombination von ENV, MO oder OVB; Die B-Spalte eine Kombination aus Takt, Befehl, Echo oder Intraverbal; die Spalte C sozial, physisch oder sozial/physisch oder physisch/sozial. FWIW ersetzt ';' mit '-' gibt die gleichen Ergebnisse – Donnied

+0

FWIW - Ich habe gerade ein Problem mit Zeilenumbrüchen entdeckt! Ich habe dos2unix verwendet und habe um jeden Spaltenwert herum Zitate hinzugefügt. Ich werde sehen, ob das hilft. – Donnied

Antwort

3

können Sie diesen Code verwenden (es braucht nicht einmal IGRAPH eigentlich ...):

# of course you need to install arcdiagram first 
# as described in the pdf 
library(arcdiagram) 

DF <- read.table(text= 
"ENV;MO,echoic;tact,social 
ENV;MO,mand,physical 
OVB,intraverbal,social 
ENV;OVB,tact,social 
OVB,intraverbal;tact,social 
OVB;ENV;MO,intraverbal;mand,social 
OVB;ENV;MO,intraverbal;mand,physical;social 
ENV;MO,mand,social;physical",sep=',') 

# replace ";" with "&\n" 
DF[] <- lapply(DF,function(x)gsub(';',' &\n',x)) 

# create adjacency matrix 
m <- rbind(as.matrix(DF[,1:2]),as.matrix(DF[,2:3])) 

# plot... 
arcplot(m ,col.arcs='DodgerBlue',lwd.arcs=2,col.labels='black',las=2) 

enter image description here

4

nicht sicher, ob das, was Sie wollen. Allerdings können Sie versuchen:

require(igraph) 
df[]<-lapply(df,strsplit,";") 
el<-as.matrix(do.call(rbind,apply(df,1,expand.grid))) 
g<-graph_from_edgelist(rbind(el[,-3],el[,-1])) 
plot(g) 

enter image description here

DATA

df<-structure(list(V1 = c("ENV;MO", "ENV;MO", "OVB", "ENV;OVB", "OVB", 
"OVB;ENV;MO", "OVB;ENV;MO", "ENV;MO"), V2 = c("echoic;tact", 
"mand", "intraverbal", "tact", "intraverbal;tact", "intraverbal;mand", 
"intraverbal;mand", "mand"), V3 = c("social", "physical", "social", 
"social", "social", "social", "physical;social", "social;physical" 
)), .Names = c("V1", "V2", "V3"), row.names = c(NA, -8L), class = "data.frame") 
+0

Ich wollte nicht unbedingt das ';' verbundene Werte - aber es sieht gut aus. Ich werde es versuchen und zu dir zurückkommen. – Donnied

+1

Ich weiß nicht, ob die mehreren Werte einzelne Knoten des Diagramms sein sollen. Wenn das der Fall ist, dann reicht 'graph_from_edgelist (rbind (as.matrix (df) [, - 3], as.matrix (df [, - 1]))) ausgehend von dem" df "meiner Antwort aus. – nicola

+0

Das resultierende Bild ist ein bisschen dicht - http://imgur.com/p4KnVjD, aber ich werde die Optionen von igraph betrachten und versuchen, es zu zwicken – Donnied