Tabellarische Daten in (gewichtete) adjacency matrix umwand.

Programmierung und Formatierung von Grafiken und Plots mit R.

Tabellarische Daten in (gewichtete) adjacency matrix umwand.

Beitragvon Jay91 » Do 28. Mär 2019, 13:05

Hallo Zusammen,

ich habe leider keine Vorerfahrung was Programmieren angeht und habe mich an igraph versucht, was halbwegs geklappt hat, bei der Umwandlung meiner eigenen Daten bin ich jedoch kläglich gescheitert.

In meinem Datensatz sind die Institutionen einer Med. Fakultät und die Publikationen aufgelistet. Mich interessieren Verbindungen zwischen den Einrichtungen in Form von Publikationen. Ich habe ein beispiel hochgeladen, da die echten Daten sensibel sind. (Beispiel (1))

Gibt es eine Möglichkeit die Spalten mit R zu scannen, sodass mir Institutionen, die zusammen publiziert haben, angezeigt werden? Im Idealfall käme eine adjacency matrix heraus, die ich dann mit igraph umsetzen könnte.

Ich bin wirklich für jede Hilfe und jeden Tipp dankbar, ich versuche seit Wochen Tutorials, aber nichts scheint so richtig darauf zu passen oder driftet in eine Richtung ab, die mir nicht weiterhilft.

Vielen Dank und Beste Grüße
Jay
Dateianhänge
Beispiel (1).xlsx
(10.49 KiB) 14-mal heruntergeladen
Jay91
 
Beiträge: 6
Registriert: Do 28. Mär 2019, 12:43
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Tabellarische Daten in (gewichtete) adjacency matrix umw

Beitragvon jogo » Do 28. Mär 2019, 21:29

Hallo Jay,

bei mir sieht das so aus:
Code: Alles auswählen
# library("xlsx")
# File <- file.choose()
# dat <- read.xlsx(File, 1, colIndex=1:2)
# dat[order(dat$PublikationsID),]

dat <- structure(list(PublikationsID = c(1, 2, 3, 4, 5, 6, 2, 7, 1,
3, 6, 8, 9, 3, 8), Institut = structure(c(1L, 1L, 1L, 1L, 1L,
  2L, 2L, 2L, 2L, 4L, 4L, 4L, 3L, 3L, 3L), .Label = c("Allgemeine Medizin",
  "Anaesthesie", "Hautklinik", "Immunologie"), class = "factor")), class = "data.frame", row.names = c(NA, -15L))
##

L <- levels(dat$Institut)

library(data.table)
setDT(dat)

nPartner <- function(l) {
  I <- dat[l==Institut, PublikationsID]
  Ko <- dat[PublikationsID %in% I, table(Institut)]
  Ko[l] <- 0
  Ko
}

sapply(L, nPartner)


Nachtrag (ich hatte die ganze Zeit gegrübelt, dass es doch auch kürzer gehen muss):
Code: Alles auswählen
library(data.table)
setDT(dat, key="PublikationsID")

D2 <- dat[dat][Institut!=i.Institut]
dcast(D2, Institut ~ i.Institut)
Das Kernstück ist der selfjoin.

Gruß, Jörg
jogo
 
Beiträge: 157
Registriert: Mo 26. Feb 2018, 09:56
Danke gegeben: 3
Danke bekommen: 1 mal in 1 Post

Re: Tabellarische Daten in (gewichtete) adjacency matrix umw

Beitragvon Jay91 » So 7. Apr 2019, 10:15

Hallo Jörg,

entschuldige die späte Antwort, ich war die letzten Tage zu sehr bei der Arbeit eingespannt. Vielen herzlichen Dank für deine Hilfe!!! Das ist echt unglaublich, dass nur wenige Zeilen bereits eine Sortierung hineinbringen, ich bin echt begeistert! Nun muss ich noch hinbekommen, dass die Edges und Nodes für den Graphen definiert sind. Da hatte ich auch mal ein Tutorial zu gemacht, werde aber wahrscheinlich wieder ein Paar Tage brauchen, um mich wieder hereinzufuchsen. Ich habe allerdings bereits gesehen, dass der Code bereits nach

Code: Alles auswählen
library("xlsx")
File <- file.choose()
dat <- read.xlsx(File, 1, colIndex=1:2)
dat[order(dat$PublikationsID),]


ein Sortierung in Tabellarischer Form hervorbringt. Könnte ich nicht theoretisch damit schon einen Graph zeichnen?

Wenn der Code bis zum Schluss über meine Daten läuft, bekomme ich in der Console viele Reihen von siehe Bild. Das ist die Matrix nur zerschnitten, weil sie nicht auf den Bildschirm passt, richtig? Ist es möglich diese Matrix zu exportiren? Wenn ich write.table oder write.csv nutze, bekomme ich nur eine tabellarische Übersicht.

Vielen Dank nochmal und einen sonnigen Sonntag!
Beste Grüße
Jay
Dateianhänge
beisp.PNG
beisp.PNG (17.13 KiB) 149-mal betrachtet
Jay91
 
Beiträge: 6
Registriert: Do 28. Mär 2019, 12:43
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Tabellarische Daten in (gewichtete) adjacency matrix umw

Beitragvon jogo » Mo 8. Apr 2019, 20:38

Hallo Jay,

Jay91 hat geschrieben:Vielen herzlichen Dank für deine Hilfe!!! Das ist echt unglaublich, dass nur wenige Zeilen bereits eine Sortierung hineinbringen, ich bin echt begeistert!
schön.

Nun muss ich noch hinbekommen, dass die Edges und Nodes für den Graphen definiert sind. Da hatte ich auch mal ein Tutorial zu gemacht, werde aber wahrscheinlich wieder ein Paar Tage brauchen, um mich wieder hereinzufuchsen. Ich habe allerdings bereits gesehen, dass der Code bereits nach
Code: Alles auswählen
library("xlsx")
File <- file.choose()
dat <- read.xlsx(File, 1, colIndex=1:2)
dat[order(dat$PublikationsID),]

ein Sortierung in Tabellarischer Form hervorbringt. Könnte ich nicht theoretisch damit schon einen Graph zeichnen?
ja, das wäre durchaus möglich.
Graphentheoretische Algorithmen sind im Paket igraph implementiert.

Wenn der Code bis zum Schluss über meine Daten läuft, bekomme ich in der Console viele Reihen von siehe Bild. Das ist die Matrix nur zerschnitten, weil sie nicht auf den Bildschirm passt, richtig?
ja
Ist es möglich diese Matrix zu exportiren?
ja, das ist möglich. Welches Format soll denn anschließend vorliegen.

Wenn ich write.table oder write.csv nutze, bekomme ich nur eine tabellarische Übersicht.
Wenn dies die gewünschten Ausgabeformate sein sollen, sind es auch die richtigen Funktionen. Bitte lies den Hilfetext zu den Funktionen. Empfehlung für das Importieren in Excel:
verpasse der Datei die Endung .txt - Excel lässt dann beim Import von Textdateien mehr Optionen zu, um die Daten passend einzulesen.

Gruß, Jörg
jogo
 
Beiträge: 157
Registriert: Mo 26. Feb 2018, 09:56
Danke gegeben: 3
Danke bekommen: 1 mal in 1 Post

Re: Tabellarische Daten in (gewichtete) adjacency matrix umw

Beitragvon Jay91 » Mi 1. Mai 2019, 12:24

Hi Jörg,

nochmals vielen Dank für die Antwort und die Anregungen! Ich habe mich mal wieder daran versucht, bin aber nicht sonderlich weit gekommen..

Die Matrix (D2, wenn ich es richtig verstehe) habe ich nicht als Matrix exportiert bekommen (die Erklärungen zu den Funktionen verstehe ich nicht so richtig. Vielleicht liegt es an mangelnden Englischkenntnissen, ich habe aber immer das Gefühl, dass mir der Bezug fehlt), dafür habe ich sie als .txt exportiert (Matrix_part.txt).

„Matrix_part.txt“ enthält nun eine Sortierung der Institutionen nach der Evaluna ID – wenn ich es plotte ( rtplot() ), dann zeigt er mir die IDs als Nodes an. Ich brauche aber nur die Institutionsnamen als Nodes, damit ein Kreisdiagramm dann (halbwegs) übersichtlich ist.

Das erreiche ich, wenn ich die Daten (hier manuell sortiert als Beispiel) wie in „Matrix_edit2.txt“ sortiere. Allerdings wäre das händisch auch noch sehr aufwändig. Kann man dies auch mit einem Code erreichen? Oder ist es sinnvoller direkt aus Matrix_part.txt zu sortieren und zu plotten?

PS.: Wenn D2 eine Matrix ist, habe ich versucht diese direkt zu plotten
Code: Alles auswählen
library(igraph)
my_matrix <- as.matrix(D2)
Organigramm <- graph.adjacency (D2, mode="undirected",diag=FALSE)
Plot(Organigramm)


allerdings bekomme ich auch hier einen Fehler.

Beste Grüße und einen schönen Feiertag,
Jay
Dateianhänge
Documents.rar
(32.95 KiB) 6-mal heruntergeladen
Jay91
 
Beiträge: 6
Registriert: Do 28. Mär 2019, 12:43
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Tabellarische Daten in (gewichtete) adjacency matrix umw

Beitragvon jogo » Mi 1. Mai 2019, 15:16

Hallo Jay,

Jay91 hat geschrieben:PS.: Wenn D2 eine Matrix ist, habe ich versucht diese direkt zu plotten
Code: Alles auswählen
library(igraph)
my_matrix <- as.matrix(D2)
Organigramm <- graph.adjacency (D2, mode="undirected",diag=FALSE)
Plot(Organigramm)

allerdings bekomme ich auch hier einen Fehler.
kannst Du bitte zeigen, welchen Fehler es dabei gibt?
Kannst Du bitte auch zeigen, mit welchem Funktionsaufruf ich die Datei, die im Archiv ist, einlesen kann.

Auch Dir noch einen schönen Feiertag,
Jörg
jogo
 
Beiträge: 157
Registriert: Mo 26. Feb 2018, 09:56
Danke gegeben: 3
Danke bekommen: 1 mal in 1 Post

Re: Tabellarische Daten in (gewichtete) adjacency matrix umw

Beitragvon Jay91 » Sa 4. Mai 2019, 14:10

Hi Jörg,

der Fehler sieht bei mir so aus:

Code: Alles auswählen
> my_matrix <- as.matrix(D2)
> Organigramm <- graph.adjacency (my_matrix, mode="undirected",diag=FALSE)
Error in graph.adjacency.dense(adjmatrix, mode = mode, weighted = weighted,  :
  At structure_generators.c:274 : Non-square matrix, Non-square matrix
In addition: Warning message:
In mde(x) : NAs introduced by coercion
> Plot(Organigramm)
Error in Plot(Organigramm) : could not find function "Plot"


Die zweite Frage verstehe ich wahrscheinlich nicht ganz. Meinst Du das Archiv mit den zwei Dateien, die ich vorhergehenden Post hochgeladen habe? Ich lese diese ein mit
Code: Alles auswählen
library(igraph)
D3 <- read.csv(file.choose(),header=TRUE,row.names = 1) #hier wähle ich die Datei Matrix_part.txt aus.
organigramm <- graph.data.frame(D3, directed=FALSE)
rtplot(organigramm)


Ansonsten: um die Matrix mit deinem Code zu erstellen lese ich "Nur 2016 Publikationen" ein mit:
Code: Alles auswählen
library("xlsx")
File <- file.choose()
dat <- read.xlsx(File, 1, colIndex=1:2)
dat[order(dat$Evaluna_ID),]
library(data.table)
setDT(dat, key="Evaluna_ID")
D2 <- dat[dat][Institut_Name!=i.Institut_Name]
dcast(D2,Institut_Name ~ i.Institut_Name)


anschließend habe ich bisher diese mit write.csv(Matrix_part.txt) gespeichert.

Beste Grüße!
Jay
Dateianhänge
Nur 2016 Publikationen.xlsx
(43.14 KiB) 3-mal heruntergeladen
Jay91
 
Beiträge: 6
Registriert: Do 28. Mär 2019, 12:43
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Tabellarische Daten in (gewichtete) adjacency matrix umw

Beitragvon jogo » So 5. Mai 2019, 08:06

Hallo Jay,

Jay91 hat geschrieben:der Fehler sieht bei mir so aus:

Code: Alles auswählen
> my_matrix <- as.matrix(D2)
> Organigramm <- graph.adjacency (my_matrix, mode="undirected",diag=FALSE)
Error in graph.adjacency.dense(adjmatrix, mode = mode, weighted = weighted,  :
  At structure_generators.c:274 : Non-square matrix, Non-square matrix
In addition: Warning message:
In mde(x) : NAs introduced by coercion
> Plot(Organigramm)
Error in Plot(Organigramm) : could not find function "Plot"

1. offensichtlich möchte die Funktion graph.adjacency() eine quadratische Matrix haben. Bitte überprüfe Dein Objekt my_matrix per
Code: Alles auswählen
dim(my_matrix). # und
str(my_matrix)

2. Bitte überprüfe, ob die Meldung NAs introduced by coercion harmlos ist, oder ob die Daten in irgendeiner Weise ungeeignet sind, z.B. character statt integer oder numeric.
3. Groß- und Kleinschreibung sind in R zu beachten: Plot() ist also eine andere Funktion als plot().

Die zweite Frage verstehe ich wahrscheinlich nicht ganz. Meinst Du das Archiv mit den zwei Dateien, die ich vorhergehenden Post hochgeladen habe? Ich lese diese ein mit
Code: Alles auswählen
library(igraph)
D3 <- read.csv(file.choose(),header=TRUE,row.names = 1) #hier wähle ich die Datei Matrix_part.txt aus.
organigramm <- graph.data.frame(D3, directed=FALSE)
rtplot(organigramm)
Es ging mir um die Parameter der Funktion read.csv() - ich müsste die Parameter (z.B. header=TRUE,row.names = 1) raten.
Hm, aus welchem Paket ist die Funktion rtplot() ? Dort hänge ich momentan fest.

Ansonsten: um die Matrix mit deinem Code zu erstellen lese ich "Nur 2016 Publikationen" ein mit:
Code: Alles auswählen
library("xlsx")
File <- file.choose()
dat <- read.xlsx(File, 1, colIndex=1:2)
dat[order(dat$Evaluna_ID),]
library(data.table)
setDT(dat, key="Evaluna_ID")
D2 <- dat[dat][Institut_Name!=i.Institut_Name]
dcast(D2,Institut_Name ~ i.Institut_Name)


anschließend habe ich bisher diese mit write.csv(Matrix_part.txt) gespeichert.

ok

Gruß, Jörg
jogo
 
Beiträge: 157
Registriert: Mo 26. Feb 2018, 09:56
Danke gegeben: 3
Danke bekommen: 1 mal in 1 Post

Re: Tabellarische Daten in (gewichtete) adjacency matrix umw

Beitragvon Jay91 » Do 9. Mai 2019, 08:08

Hi Jörg,

nochmals viele Dank, dass Du Dir immer wieder Zeit nimmst, um zu antworten! rtplot() habe ich irgendwo aufgeschnappt, habe die Quelle leider nicht mehr. Ich kann leider nicht wirklich was mit den Funktionen, die Du mir empfohlen hast, anfangen. Ich bin mittlerweile aber auch damit so fertig, dass ich den Daten wahrscheinlich per Hand den letzten Schliff geben werde, um diese dann mit igraph verarbeiten zu können. Deshalb belästige ich Dich noch ein Mal, wenn es okay ist :)

Die Datei mymatrix.csv enthält eine Zuordnung der Institutionen nach PublikationsID. Allerdings ist alles in einer Spalte. Gibt es eine Funktion, um die vorangehende Nummer zu löschen und die nacheinanderstehenden Begriffe in separate Spalten zu schreiben? Wenn das zu umständlich ist, werde ich es einfach per Hand machen, will nur noch damit fertig werden.

Besten Dank und schöne Grüße,
Jay
Dateianhänge
mymatrix.zip
(6.22 KiB) 5-mal heruntergeladen
Jay91
 
Beiträge: 6
Registriert: Do 28. Mär 2019, 12:43
Danke gegeben: 0
Danke bekommen: 0 mal in 0 Post

Re: Tabellarische Daten in (gewichtete) adjacency matrix umw

Beitragvon jogo » Do 9. Mai 2019, 20:30

Hallo Jay,

also ich bekomme einen Dataframe mit drei Spalten:
Code: Alles auswählen
> setwd("~/Downloads")
> dat <- read.table("mymatrix.csv", stringsAsFactors = FALSE)
> str(dat)
'data.frame':   1362 obs. of  3 variables:
$ V1: int  141 141 141 141 141 141 141 141 141 141 ...
$ V2: chr  "NEUROLOGIE" "PSYCHIATRIE" "IZPH" "MEDINF" ...
$ V3: chr  "MEDINF" "MEDINF" "MEDINF" "NEUROLOGIE" ...


Gruß, Jörg
jogo
 
Beiträge: 157
Registriert: Mo 26. Feb 2018, 09:56
Danke gegeben: 3
Danke bekommen: 1 mal in 1 Post

Nächste

Zurück zu Grafiken und Plots

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste

cron