Bitte klicken Sie auf den Link.
Kombination von Box- und Jitter Plots mit ‘ggplot2’
Mit dem ggplot2-Package lassen sich verschiedene Plots miteinander kombinieren. So bietet z.B. eine Kombination von Box- und Jitter Plot die Möglichkeit, in einer Graphik sowohl basale Verteilungsmerkmale (Median, Quartile etc.) als auch die Verteilung der Werte selbst darzustellen. Darüber hinaus lassen sich auch sogenannte Cut-Off-Werte darstellen.
In diesem Tutorial zeige ich, wie man mit dem ggplot2-Package Box- mit sogenannten Jitter Plots kombiniert.
Zunächst erstellen wir drei Zufallsvariablen (var.scale, var.group, var.cutoff) mit jeweils 300 Fällen. Die Variable var.scale ist eine metrische Variable und hat einen WerteBereich von 0 bis 101, die Variable var.group ist eine Faktorvariable und enthält die Gruppen male und female. Die dritte Variable wurde auf Grundlage der var.scale-Variable mit vorher festgelegten Cut-Off-Werten berechnet. Dabei entsprecht der Wertebereich 0 – 40 der Kategorie low, der Wertebereich 41 – 60 der Kategorie medium und der Wertebereich > 60 der Kategorie high.
set.seed(1111)
var.scale <- round(rnorm(300, 50, 17))
var.group <- rbinom(300, 1, .5)
var.group <- factor(var.group,
levels = c(0:1),
labels = c("male", "female"))
var.cutoff <- ifelse(var.scale <= 40, 1,
ifelse(var.scale > 40 & var.scale <= 60, 2, 3))
var.cutoff <- factor(var.cutoff,
levels = c(3:1),
labels = c("high", "medium", "low"))
Mit der describe()-Funktion aus dem Hmisc-Package lassen sich die Verteilungen dieser variablen anzeigen.
library(Hmisc)
describe(var.scale)
## var.scale ## n missing unique Info Mean .05 .10 .25 .50 ## 300 0 76 1 52.18 24.00 28.90 41.00 51.00 ## .75 .90 .95 ## 65.00 75.00 80.05 ## ## lowest : 0 13 15 16 19, highest: 91 92 93 94 101
describe(var.group)
## var.group ## n missing unique ## 300 0 2 ## ## male (142, 47%), female (158, 53%)
describe(var.cutoff)
## var.cutoff ## n missing unique ## 300 0 3 ## ## high (98, 33%), medium (129, 43%), low (73, 24%)
Im letzten Vorbereitungsschritt verknüpfen wir die soeben generierten Variablen mit der data.frame()-Funktion zu einem Dataframe, den wir df nennen. Dieser Schritt ist notwendig, da das im Folgenden verwendete Graphikpaket ggplot2 nur mit in einem Dataframe gespeicherten Daten funktioniert.
df <- data.frame(var.scale, var.cutoff, var.group)
Im Folgenden werden mit den Funktionen xlab(), ylab() und ggtitle() Labels für die X- und Y-Achse sowie ein Titel vergeben.
Die beiden Boxplots werden mit der Funktion geom_boxplot() aufgerufen, mit der Eigenschaft width wird die Breite der Plots spezifiziert.
Mit der Funktion geom_jitter() werden die Jitter Plots aufgerufen. Auch diese Funktion wird durch die Angabe verschiedener Eigenschaften (colour, position, size etc.) näher bestimmt.
library(ggplot2)
ggplot(df) +
xlab("Group") +
ylab("Scale") +
ggtitle("Combination of Box and Jitter Plot") +
geom_boxplot(aes(var.group, var.scale),
width=0.5) +
geom_jitter(aes(var.group, var.scale, colour = var.cutoff),
position = position_jitter(width = .15, height=-0.7),
size=2) +
scale_y_continuous(limits=c(0, 101),
breaks = seq(0, 110, 10)) +
scale_color_manual(name="Legend",
values=c("red", "blue3", "green3"))

Abschließend werden mit den Funktionen scale_y_continuous() bzw. scale_color_manual() Y-Achse und Legende formatiert.
Grafiken mit Hintergrundbild erstellen
Manchmal kann es sinnvoll sein, die graphische Darstellung einer statistischen Größe auf ein Hintergrundbild zu applizieren. Mit R lässt sich das folgendermaßen bewerkstelligen:
Zuerst liest man mit der readJPEG()-Funktion aus dem jpeg-Paket das ausgewählte Hintergrundbild ein (im Beispiel heißt es blackboard.jpg).
library(jpeg)
imgage <- readJPEG("blackboard.jpg")
Danach lädt man die Pakete ggplot2 und grid, wobei mit dem ersten Paket die Grafik erzeugt und mit dem zweiten Paket das Hintergrundbild – hier eine Tafel – eingebunden wird.
library(ggplot2)
library(grid)
ggplot(diamonds) +
annotation_custom(rasterGrob(imgage,
width=unit(1,"npc"),
height=unit(1,"npc")),
-Inf, Inf, -Inf, Inf) +
geom_bar(aes(clarity), fill="white", colour="red") +
xlab("") +
ylab("") +
ggtitle("Säulendiagramm mit Hintergrundbild") +
scale_fill_continuous(guide = FALSE)
PS: Der Dataframe diamonds sowie die darin enthaltene Variable clarity werden mit dem Paket ggplot2 geladen.
R-Dateien in Abhängigkeit vom Betriebssystem aufrufen
Abhängig vom Betriebssystem (z.B. Windows, Linux, Mac) unterscheidet sich die Struktur der Dateien und Pfade zum Teil erheblich. Während auf einem Windows-Betriebssystem jede Partition der Festplatte mit einem Buchstaben bezeichnet wird (z.B. C:) und Datein standardmäßig in einem Ordner abgespeichert werden, der sich auf dieser Partition befindet (z.B. C:\name\Eigene Dateien\Documents), so hält ein Linux-Betriebssystem als Speicherort für Dateien die sogenannte home-Partition vor (z.B. /home/name/Documents).
Arbeitet man mit R an verschiedenen Rechnern, so bietet es sich an, seine Datein etc. mit Hilfe eines Cloud-Speichers zu synchronisieren. Solche Cloudspeicher (z.B. Dropbox, Google Drive, Copy) werden von verschiedenen Anbietern kostenlos zur Verfügung gestellt.
Sind auf diesen Rechnern unterschiedliche Betriebssysteme installiert (siehe oben), so sollte dies beim Schreiben des R-Codes berücksichtigt werden. Der folgende Code zeigt, wie man zunächst mit der Sys.info()-Funktion den Namen des Betriebssystems überprüft und danach in Abhängigkeit vom vorhandenen Betriebssystem, das Arbeitsverzeichnis festlegt (mit der setwd()-Funktion).
if (Sys.info()['sysname']=="Windows") # Check if name of operting system is 'Windows'
{
setwd("C:/Programs/Copy/Projects")
} else
{
setwd("/home/name/Projects")
}
source("myRfile.R")
In einem weiteren Schritt kann dann mit der source()-Funktion ein R-File ausgeführt werden, das sich in diesem Arbeitsverzeichnis befindet.
ggplot-Graphiken mit der source()-Funktion aufrufen
In R gibt es die Möglichkeit, mit der source()-Funktion von einem sogenannten MAKE- oder Masterfile aus auf eine oder mehere Quelldateien zuzugreifen. Dies bietet sich vor allem dann an, wenn der R-Code sehr umfangreich ist. Eine Aufteilung dies Codes in mehrere Source-Files sorgt dabei für eine größere Übersichtlichkeit.
source("C:/A_ggplot.R")
In der source()-Funktion müssen Name und Ort der Quelldatei angegeben werden. Das A_ am Anfang der im Beispielcode verwendeten Datei A_ggplot.R zeigt an, dass es sich bei der Quelldatei um ein Analyse-File handelt. Die Bezeichnung ggplot weißt darauf hin, dass mit dieser Datei eine Graphik mit dem R-Paket ggplot2 erzeugt wird.
library(ggplot2)
data(diamonds) # 'diamonds' ist ein in R bereitgestellter Datensatz
ggplot(diamonds, aes(clarity, fill = cut)) + geom_bar()
Ruft man die Quelldatei A_ggplot.R mit der source()-Funktion auf, wird jedoch keinerlei Output erzeugt.
source("C:/A_ggplot.R")
Um die gewünschte Grafik zu erzeugen, gibt es zwei Möglichkeiten. Zum einen kann die source()-Funktion um die Angabe print.eval=TRUE ergänzt werden:
source("C:/A_ggplot.R", print.eval = TRUE)
Zum anderen kann die in der Quelldatei erzeugte Grafik als Objekt (hier: chart) gespeichert und danach der print()-Funktion zugewiesen werden:
library(ggplot2)
data(diamonds) # 'diamonds' ist ein in R bereitgestellter Datensatz
chart <- ggplot(diamonds, aes(clarity, fill = cut)) + geom_bar()
print(chart)
Der Aufruf des Quellfiles erfolgt wie bereits weiter oben angegeben:
source("C:/A_ggplot.R")
Und der gewünschte Output wird erzeugt:
How to remove objects from workspace
Since every object in the R workspace requires some part of the RAM, it is sometimes useful to remove objects from workspace being not necessary for further calculations. In R, there are several ways to ged rid of such objects.
The above image shows the workspace pane of RStudio.
If you intend to remove all objects from workspace, use the following code:
rm(list = ls())
If you want to remove some objects (in this case we remove the objects a, b and c) from workspace, use the following code. Each object you want to remove must be specified between the brackets separated by comma.
rm(a, b, c)
Sometimes it may occurr that you want to remove more than just a few but not all objects. In this case, specifying every single object would require a lot of typing.
In case you want to remove all objects but a few (e.g. the dataframe(s) you work with), you can use the following code.
rm(list = c(setdiff(ls(), c("mydata.1", "mydata.2"))))
The above code will remove all objects except for the objects named mydata.1 and mydata.2.

The above image shows the workspace containing only the desired objects.
readxl – a new r package to import data from excel
There are many ways to import data from excel spreadsheets into R (see ‘R Tutorial on Reading and Importing Excel Files into R’).
With Hadley Wickham’s recent r-package readxl, it is possible to import large excel files very quickly.
library(readxl)
# example 1
mydata <- read_excel("excelfile.xls", sheet = "sheet1")
# example 2
mydata <- read_excel("C:/myfiles/excelfile.xlsx", sheet = 1)
# example 3
mydata <- read_excel("excelfile.xlsx", sheet = 1, na = "99")
Example 1 loads the sheet sheet1 from excel file named excelfile.xls
The code examples are quite straightforward and easy to understand. The sheet we wish to import maybe specified either as string (the name of a sheet, see example 1) or as integer (the position of the sheet, see example 2).
In case the excel file we wish to import is not located in the current working directory, we need to specify the path to the excel file (see example 2).
Moreover, it is possible to specify a missing value (only one). In example 3, the value 99 will be treated as missing value.
Since the readxl package has been published only very recently, it is rather likely that the author will add some more features in the future.
How to: Aufteilen eines Dataframe nach Variablentyp
R zeichnet sich u.a. dadurch aus, dass es mit vielen verschiedenen Datenformaten bzw. -typen ‘zurecht kommt’. So lassen sich Werte u.a. in Vektoren, Matritzen und Listen speichern. Das wohl am meisten verwendete Datenformat ist jedoch der dataframe. Enthält ein solcher dataframe eine sehr große Anzahl von Variablen, kann es sinnvoll sein, diesen anhand des Variablentyps aufzuteilen. Dabei ist die Unterscheidung zwischen numerischen Variablen, kategorialen Variablen und Stringvariablen sinnvoll.
Das folgende Beispiel zeigt, wie man aus einem dataframe drei neue dataframes erstellt, die jeweils nur String, kategoriale bzw. numerische Variablen enthalten.
Zunächst erzeugen wir einen dataframe, der insgesamt 100 Fälle und sechs Variablen enthält, wobei die Namen der Variablen für den Variablentyp stehen.
mydataframe <- data.frame(string.1 = rep(c("text1", "text2"), 50), string.2 = rep(c("text3",
"text4"), 50), categorial.1 = as.factor(rep(c("male", "female"), 50)), categorial.2 = as.factor(rep(c("young",
"old"), 50)), numeric.1 = rnorm(100, 200, 30), numeric.2 = rnorm(100, 60,
5))
mydataframe$string.1 <- as.character(mydataframe$string.1)
mydataframe$string.2 <- as.character(mydataframe$string.2)
Danach lassen wir uns Informationen zu den einzelnen Variablen anzeigen.
str(mydataframe)
## 'data.frame': 100 obs. of 6 variables: ## $ string.1 : chr "text1" "text2" "text1" "text2" ... ## $ string.2 : chr "text3" "text4" "text3" "text4" ... ## $ categorial.1: Factor w/ 2 levels "female","male": 2 1 2 1 2 1 2 1 2 1 ... ## $ categorial.2: Factor w/ 2 levels "old","young": 2 1 2 1 2 1 2 1 2 1 ... ## $ numeric.1 : num 241 253 202 135 157 ... ## $ numeric.2 : num 64.3 62.7 58.7 63.1 59.2 ...
Die Bezeichnungen chr, Factor und num weißen darauf hin, dass es sich bei unseren Variablen tatsächlich um jeweils zwei String-, kategoriale sowie numerische Variablen handelt.
Stringvariablen
Die folgende Anweisung schreibt alle Stringvariablen des dataframes ‘mydataframe’ in einen neuen dataframe namens ‘df.string’. Dabei werden die Variablennamen des dataframe ‘mydataframe’ zunächst in einem Vector names ‘vars’ gespreichert. In einem zweiten Schritt wird überprüft, bei welchen Variablen es sich um Stringvariablen handelt. Die Namen dieser Variablen werden in dem Vector ‘string.vars’ gespreichert. Schlussendlich wird ein neuer dataframe (‘df.strings’) erstellt, der alle Stringvariablen des dataframe ‘mydataframe’ enthält.
vars <- colnames(mydataframe)
string.vars <- vars[sapply(mydataframe[, vars], class) %in% "character"]
df.string <- data.frame(mydataframe[, string.vars])
Mit dem folgenden Befehl lässt sich anzeigen, welchen Variablentyp die Variablen des dataframe ‘df.string’ haben. Es zeigt sich, dass es sich dabei tatsächlich nur um Stringvariablen handelt. Genauer gesagt: um alle Stringvariablen des dataframes ‘mydataframe’.
summary(df.string)
## string.1 string.2 ## Length:100 Length:100 ## Class :character Class :character ## Mode :character Mode :character
Will man die Namen der im neuen dataframe enthaltenen Variablen ändern, ist das mit dem folgenden Befehl möglich:
library(dplyr)
for (i in 1:length(string.vars)) {
df.string <- rename_(df.string, .dots = setNames(colnames(df.string[i]),
paste0("var.", i)))
}
Die neuen Variablennamen setzten sich aus dem Wortstamm ‘var’ und einem Suffix zusammen, das die Position der Variable im dataframe widergibt:
names(df.string)
## [1] "var.1" "var.2"
Analog dazu lassen sich dataframes erstellen, die ausschließlich kategoriale bzw. numerische Variablen enthalten:
Kategoriale Variablen
# Erstellen des dataframe
categorial.vars <- vars[sapply(mydataframe[, vars], class) %in% "factor"]
df.categorial <- data.frame(mydataframe[, categorial.vars])
# Umbenennen der Variablen
library(dplyr)
for (i in 1:length(categorial.vars)) {
df.categorial <- rename_(df.categorial, .dots = setNames(colnames(df.categorial[i]),
paste0("var.", i)))
}
Numerische Variablen
# Erstellen des dataframe
numeric.vars <- vars[sapply(mydataframe[, vars], class) %in% c("numeric", "integer")]
df.numeric <- data.frame(mydataframe[, numeric.vars])
# Umbenennen der Variablen
library(dplyr)
for (i in 1:length(numeric.vars)) {
df.numeric <- rename_(df.numeric, .dots = setNames(colnames(df.numeric[i]),
paste0("var.", i)))
}
„PubMed Commons“: Description and Analysis of PubMed’s new commenting system
A few days ago I published a paper on Pubmed Commons called “Description and Analysis of PubMed’s new commenting system.” The paper, data and code are freely available under http://www.bibliometrie-pf.de/article/view/204. For some strange reason, I’ve decided to publish this paper in German. However, the abstract is also available in English:
With „PubMed Commons“, the world’s largest biomedical literature database has recently launched a forum for commenting on publications. PubMed Commons is open to any authors in PubMed. The purpose of this investigation is to describe and analyse all comments that have been published so far.
The analysed dataset comprises all comments written between June 2013 und May 2014, the forum users’ gender, the year the commented papers were published and the journal names. Furthermore, the number of comments containing a question or further references was assessed.
In total, 1.358 comments were published by 460 forum users. 90% of all papers were commented once, 30% of all comments were written by 10 users and half of the commented papers were published in 2013 and 2014. Since PubMed Commons was officially launched, the number of monthly published comments has continuously declined. 1/4 of comments contained a question and about 2/3 of comments contained further references. 90% of the forum users were male.
Since nearly any relevant biomedical journal is listed in PubMed, PubMed Commons has the potential to improve the networking of the worldwide scientific community regardless of publishing house or journal. However, PubMed Commons has hardly become interactive so far.
The following chart shows how frequently Pubmed Commons was used between 2013 June and 2014 May.

“Making Sense of Data”
Google bietet demnächst einen kostenlosen Online-Kurs zum Thema “Making Sense of Data”.
From March 18 to April 4, 2014 Google offers a free online course named “Making Sense of Data”.

