R-Profis hier?

cyberjonny

Active member
Themenstarter
Registriert
22 Sep. 2007
Beiträge
9.770
Hi,

sind hier Profis in der Programmiersprache bzw. Statistiksoftware R unterwegs?

Ich versuche gerade, ein Script zu basteln, das anhand von Daten aus einer Tabelle entsprechende Boxplots generiert - und scheitere bisher noch kläglich... :rolleyes: :(

Also falls sich jemand (gut) damit auskennt, würde ich mich freuen, wenn er/sie mir etwas Hilfestellung leisten könnte. Dann gerne einfach hier im Thread oder per PN melden.

Danke und Gruß,
Jonny
 
wenn sich jemand findet: Bitte hier im Thread posten, da ich auch an R interessiert bin ^^
 
Generell ist Stackoverflow.com immer eine gute Quelle für Problemlösungen. Aber ich kenne das Problem, die Sachen, die man irgendwo findet dann auch auf das eigene Datenset anzuwenden, ich habe mir im Laufe dieses Jahres R selbst beigebracht und musste eine Menge nachschlagen.

Also will ich mal versuchen zu helfen. Am besten wäre es wenn du ein Beispieldatenset und dein Script hochladen könntest und dazu sagst, was passieren sollte.
 
Ich kann auch ein klein wenig mit R umgehen. Allerdings selber auch alles per learning by doing und daher insgesamt noch relativ oberflächlich. Am besten Beispieldatensatzs und Skript hochladen (+ Schilderung der Probleme) und dann kann man mal gucken. Ansonsten gibts auch ein R-forum, da bekommt man auch oft sehr gute Hilfe :).
 
Die Tabelle einlesen (z.b. read.csv("pfad")), als dataframe speichern und darauf die boxplot-Funktion anwenden. Das wäre mein erster Ansatz. Bin aber auch mehr schlecht als recht in R unterwegs.
 
Hi miteinander,

zunächst mal vielen Dank für die zahlreichen freundlichen Rückmeldungen! :thumbup:
Leider kann/darf ich keines der Datensets als Beispiel liefern, da sie vertrauliche Daten enthalten. Wenn es notwendig werden sollte, würde ich aber ein Beispiel-Datenset aus Pseudodaten basteln. Vielleicht muss das aber auch gar nicht sein, weil ich zwischenzeitlich selbst schon etwas weiter gekommen bin.

Mein aktueller Stand:
Die Daten werden erfolgreich in R eingelesen und es werden grundsätzlich korrekte Boxplots daraus erzeugt.

Meine aktuellen Probleme:
1. Die Skala der y-Achse sollte andersherum sein. Sie geht von 0 (unten) bis 100 (oben), soll aber von 100 (unten) bis 0 (oben) gehen. [mittlerweile gefixt]
2. Ich würde die Reihenfolge der einzelnen Boxplots samt Labels auf der x-Achse gerne manuell festlegen. [auch gefixt]
3. Cool wäre, wenn in Klammern hinter den Labels auf der x-Achse die Anzahl der jeweils (für den entsprechenden Boxplot) verwendeten Werte steht.


Vielleicht habt ihr dazu ja die eine oder andere gute Idee... und ich recherchiere dereil auch mal weiter! :)

Danke euch soweit!
Gruß, Jonny
 
Zuletzt bearbeitet:
Also das mit den Daten dachte ich mir schon, daher meinte ich auch eher ein Dummy-Set samt Originalscript (mit wenn notwendig ausgetauschten Labels). Dann könnte ich dir das einfach in dein Script reinbasteln und selbst nochmal vorher testen.

Prinzipiell erledigt sich der zweite Punkt, wenn du mit gelabelten Listen arbeitest, da ist dann Reihenfolge in der Liste = Reihenfolge auf der X-Achse.

Drittens ist geht am einfachsten, indem du die Original-X-Achse mittels xaxt="n" ausschaltest (dann kannst du auch eine Liste ohne labels nehmen), dem Plot eine Bezeichnung zuweist (xyz <- boxplot(...)) und dann in einem seperaten Schritt eine X-Achse einfügst (axis(2, ..., at=xyz, labels=paste(c(deineLabels),"(", xyz$n,")", sep="")

Im Großen und Ganzen mache ich es bei meinen Auswertungen meistens so, dass ich entweder mit einer csv mit eindeutig benannten Zeilen starte oder mir eine aus einem Ordner mit den ganzen Einzelfiles erstelle.
Daraus ziehe ich mir dann per "subset" die interessanten Daten, führe meine Berechnungen durch und packe die Ergebnisse dann in Vektoren oder Matritzen. Die kann ich dann wiederum speichern und/oder für eine Visualisierung entsprechend vorbereiten (Das ist das einzig nervige an den vielen verfügbaren R-libraries, dass sie immer wieder verschiedene Datenformate wollen, Listen, Matritzen, Arrays oder Dataframes, da muss man auspassen und die Beschreibung lesen). Die entsprechenden Plots packe ich dann mittels cairo_pdf in ein PDF, woraus sich dann mit Inkscape wunderbar die endgültigen Abbildungen machen lassen (einzig bei den Beschriftungen ist es etwas umständlicher, da cairo_pdf teilweise mit Unterschneidungen arbeitet und alle Schrift aus einem Befehl als einen Text ausgibt).
 
Zuletzt bearbeitet:
Also 2. habe ich jetzt mit der Codezeile
Code:
mytable$labels <- factor(mytable$labels, levels=c("A", "B", "C", "D"), ordered=TRUE)
umsetzen können. Das bringt die in der Spalte "labels" mehrfach und unsortiert vorkommenden Werte A, B, C, D in die richtige Reihenfolge.

Keine Ahnung, wie sauber das ist, aber das Ergebnis scheint soweit zu passen.


Deine Erklärung zu 3. habe ich nicht ganz verstanden, aber ich muss mal noch etwas rumprobieren.


Wichtiger wäre jetzt noch etwas anderes:
Ich würde gerne innerhalb einer bestimmten Spalte in der Tabelle (labels) manche Zeichen(ketten) durch andere Zeichen(ketten) ersetzen, noch bevor daraus die Beschriftungen für die x-Achse erzeugt werden. Wie geht das?
Versucht habe ich:

sub("A", "A1", mytable$labels)

Aber das klappt nicht...
 
Zuletzt bearbeitet:
Deine Lösung passt schon, kommt halt immer auf die Datenstruktur an, wie man das macht.

Zu 3.: du kannst einfach xaxt="n" in die Parameter für boxplot-command aufnehmen, dann wird keine X-Achse gezeichnet, nach dem Command kannst du dann mit axis eine x-Achse neu hinzufügen und die labels festsetzen, dieser Extraschritt ist notwendig, da du erst den n-Wert aus dem Bosplot brauchst.


Zu dem neuen Punkt: Da solltest du "gsub" nehmen, sonst wird nur das erste Mal die Ersetzung vorgenommen.
 
Zuletzt bearbeitet:
Danke, aber das funktioniert leider auch nicht. In der Tabelle(nspalte) sind alle Werte unverändert; die Beschriftung der x-Achse ebenfalls.


/Edit: Mein Fehler, es ändert sich was - allerdings nur in der Konsole sichtbar, nicht in der zuvor aufgerufenen Tabelle (ich arbeite mir RStudio). Trotzdem sieht man die Änderungen nicht in der Achsenbeschriftung, wo sie eigentlich am wichtigsten wären.
 
Zuletzt bearbeitet:
Hm, nutzt du die originaltabelle dafür, oder hast du ein R-Objekt damit gemacht? Versuch einfach mal das Ganze unter neuem Namen abzuspeichern.

EDIT: weist du den gsub-Befehl auch der Tabelle zu? ansonsten ersetzt er nämlich in der Tat nur den Output aber speichert es nirgends. Also einfach TabelleXYZ <- gsub(...)
 
Zuletzt bearbeitet:
Mein aktueller Code sieht so aus:
Code:
mytable <- read.table("Pfad-zur-Tabelle", sep="\t", header=TRUE, fileEncoding="UTF-8")
mytable$labels <- factor(mytable$labels, levels=c("A", "B", "C", "D"), ordered=TRUE)
boxplot(mytable$s1 ~ mytable$labels, ylim=c(100, 0))

Die x-Achse ist entsprechend mit den Labels aus der "labels"-Spalte beschriftet in der gewünschten Reihenfolge A, B, C, D.


Jetzt hätte ich gerne, dass bei der x-Achsenbeschriftung A durch A1, B durch B1, C durch C1 und D durch D1 ersetzt wird.
Ob das bereits innerhalb der Tabelle in der "labels"-Spalte geschieht oder erst bei der Achsenbeschriftung selbst, ist eigentlich zunächst zweitrangig...
 
Na, das ist doch mal was zum Arbeiten :cool:

Code:
mytable <- read.table("Pfad-zur-Tabelle", sep="\t", header=TRUE, fileEncoding="UTF-8")
mytable$labels <- factor(mytable$labels, levels=c("A", "B", "C", "D"), ordered=TRUE)
mytable <- gsub("A", "A1", mytable$labels)
mytable <- gsub("B", "B1", mytable$labels)
mytable <- gsub("C", "C1", mytable$labels) 
mytable <- gsub("D", "D1", mytable$labels) 
myBoxplot <- boxplot(mytable$s1 ~ mytable$labels, ylim=c(100, 0), xaxt="n")
axis(2, at=myBoxplot$names, labels=paste(levels(mytable$labels),"(", myBoxplot$n,")", sep=""))

So sollte es funzen, samt n in den Labels.

EDIT: Fehlende Klammer eingefügt.
 
Zuletzt bearbeitet:
Tausend Dank für deine Hilfe, Turambar! :)

Jetzt sind 2 weitere Probleme aufgetaucht:

1. Der Plot bricht mit dem Fehler "Error in mytable$s1 : $ operator is invalid for atomic vectors" ab.
Das passiert bereits dann, wenn ich in meinen Code nur eine gsub-Zeile einfüge.
Also das hier funktioniert:
Code:
mytable <- read.table("Pfad-zur-Tabelle", sep="\t", header=TRUE, fileEncoding="UTF-8")
mytable$labels <- factor(mytable$labels, levels=c("A", "B", "C", "D"), ordered=TRUE)
boxplot(mytable$s1 ~ mytable$labels, ylim=c(100, 0))
Aber das hier nicht mehr:
Code:
mytable <- read.table("Pfad-zur-Tabelle", sep="\t", header=TRUE, fileEncoding="UTF-8")
mytable$labels <- factor(mytable$labels, levels=c("A", "B", "C", "D"), ordered=TRUE)
[B]mytable <- gsub("A", "A1", mytable$labels)[/B]
boxplot(mytable$s1 ~ mytable$labels, ylim=c(100, 0))


2. Sind die Ersetzungen etwas komplexer (das hatte ich übersehen). Es gibt nämlich nicht nur A, B, C, D, sondern z.B. auch AX und BY.
Mit
Code:
mytable <- gsub("A", "A1", mytable$labels)
mytable <- gsub("B", "B1", mytable$labels)
...
wird jetzt nicht nur (wie gewünscht) A zu A1 und B zu B1, sondern auch (nicht gewünscht) AX zu A1X und BY zu B1Y.
Lässt sich das auch irgendwie so machen, dass wirklich nur exakt A, B... ersetzt werden, während AX, BY... unangetastet bleiben?

Danke!
 
OK, ersetze mal

Code:
mytable <- gsub("A", "A1", mytable$labels)

durch

Code:
mytable$labels <- gsub("A", "A1", mytable$labels)

Für das zweite Problem musst du mit regulären Ausdrücken arbeiten

Code:
mytable$labels <- gsub("([A]$)", "A1", mytable$labels)

ich hoffe, dass das so klappt, bei RegEx muss ich immer nochmal die Syntax nachschauen und im Zweifel probieren.

Wenn wir eh schon bei RegEx sind, können wir dir das Leben auch noch ein Stück einfacher machen:

Code:
mytable$labels <- gsub("([[:alpha:]]{1})", "\\11", mytable$labels)

damit solltest du nur eine Zeile Code für alle Umbenennungen brauchen, alles, was aus exakt einem Buchstaben besteht, bekommt eine "1" angehangen.
 
Zuletzt bearbeitet:
Jetzt bin ich es schon wieder...

Leider ist das Resultat noch nicht in der Darstellungsform, wie ich es brauche.

Was funktioniert:
Die vorliegenden Daten werden korrekt eingelesen und es werden saubere Boxplots daraus erstellt. Die in der Tabellenspalte "labels" mehrfach und durcheinander vorliegenden Labels A, B, C, D werden unter den Boxplots als x-Achsenbeschriftung in der gewünschten Reihenfolge dargestellt. Das geschieht mit folgendem Code:
Code:
mytable <- read.table("Pfad-zur-Tabelle", sep="\t", header=TRUE, fileEncoding="UTF-8")
mytable$labels <- factor(mytable$labels, levels=c("A", "B", "C", "D"), ordered=TRUE)
boxplot(mytable$s1 ~ mytable$labels, ylim=c(100, 0))

Was funktioniert nicht bzw. was ist das Ziel:
Die "labels"-Spalte in der Tabelle enthällt der Einfachheit und Kompatibilität halber nur "normale" Buchstaben und Zahlen. Letztendlich entsprechen einige dieser "vereinfachten Labels" aber Sonderzeichen. In der "labels"-Spalte steht z.B. "oe", die Darstellung in/unter dem Boxplot in R soll aber dann wieder korrekt "œ" sein. Das scheint R allerdings nicht zu mögen. Folgende Ansaätze habe ich bereits probiert, damit die Sonderzeichen korrekt dargestellt werden:

1. Die Sonderzeichen direkt in der Tabelle eintragen -> R plottet nichts mehr.
2. Die Sonderzeichen via Unicode in der Tabelle eintragen (z.B. \u0153 für œ) -> R plottet nichts mehr.
3. Die Sonderzeichen erst in der Darstellung in R ändern -> Funktioniert nicht bzw. mache ich vermutlich einen Fehler?

Am liebsten wäre mir, wenn der 1. (oder 2.) Ansatz funktionieren würde. Dann könnte ich mit einem simplen Skript in der Tabelle alle "vereinfachten Labels" durch die "korrekten Labels" mit Sonderzeichen ersetzen lassen. Allerdings habe ich keine Ahnung, warum R die Tabelle dann nicht mehr mag bzw. wie ich R dazu kriege, sie wieder zu mögen und mir daraus entsprechende Boxplots zu generieren. Die sollen ja eigentlich genau so sein, wie es bereits funktioniert, nur eben mit einigen Sonderzeichen.

Letzten Endes würde es mir aber zur Not auch reichen, wenn ich die x-Achsenbeschriftung der mit dem obigen Code problemlos erzeugten Boxplots einfach entfernen und durch eine neue x-Achsenbeschriftung mit korrekten Sonderzeichen ersetzen könnte. Aber auch das bekomme ich leider nicht hin...
 
Ja, Sonderzeichen und mathematische Operatoren sollte man in R vermeiden innerhalb von Tabellen, Labels etc.

Mit Sonderzeichen in den Plot-Labels habe ich mich auch schon vergeblich versucht. Im Endeffekt mache ich das dann in Inkscape mit den exportierten pdfs. Evtl. könntest du den fileEncoding Parameter ändern, UTF-8 enthält meines Wissens nach nicht so viele Sonderzeichen, aber im Plot klappt es dann wahrscheinlich trotzdem nicht. Wenn doch, gib auf jeden Fall Bescheid.

Hat denn das Replacement-Zeugs funktioniert?
 
Danke für die Info - das ist zwar einerseits doof/schade, andererseits gut zu wissen; dann verschwende ich dafür wenigstens keine Zeit mehr, wenn das sowieso nicht richtig funktioniert.

Das Replacement-Zeug hat grundsätzlich funktioniert, allerdings dann nicht (mehr), als ich Buchstaben/Zahlen durch Sonderzeichen ersetzen wollte. ;) Aber das lag ja dann nicht am Ersetzen an sich, sondern an den Sonderzeichen, wie ich nun weiß.
 
Danke für die Info - das ist zwar einerseits doof/schade, andererseits gut zu wissen; dann verschwende ich dafür wenigstens keine Zeit mehr, wenn das sowieso nicht richtig funktioniert.

Na ja, vom streng wissenschaftlichen Standpunkt aus haben Sonderzeichen in einer Grafik auch nichts zu suchen: Die Grafik ist eine mathematische Codierung eines Sachverhalts der objektiven Realität und die Sonderzeichen selbst sind eine weitere Codierung eines Sachverhalts der objektiven Realität: Die Eindeutigkeit oder gar Eineindeutigkeit der Ergebnisse muss bei der Darstellung wissenschaftlicher Ergebnisse immer gewahrt bleiben.

Man verwendet kompatible Variablen eines Alphabets wie
in der Grafik und schreibt unter die Grafik eine Legende.

A - Bedeutung von A
B - Bedeutung von B
C - Bedeutung von C
...
 
Zuletzt bearbeitet:
  • ok1.de
  • IT Refresh - IT Teile & mehr
  • thinkstore24.de
  • Preiswerte-IT - Gebrauchte Lenovo Notebooks kaufen

Werbung

Zurück
Oben