3
3.14
"Hallo!"
'Text.'
1+1
2*2
1/3
2-1
10^3
3>2
2<4
1<=1
2>=1
3==1
"Hallo!" != 'Text.'
"X" == "U"
TRUE == TRUE
TRUE != FALSE
TRUE & TRUE
TRUE && FALSE
TRUE | TRUE
TRUE || FALSE
! TRUE
xor(TRUE, FALSE)
Zum definieren von Variablen sind Buchstaben, Zahlen, Punkt und Unterstrich im Namen erlaubt, also:
variable_nummer1. | ok |
.variable_nummer | ok |
variable.nummer | ok |
.1variable_nummer | nicht ok, nach "." darf keine Zahl folgen |
1variable_nummer | nicht ok, Name darf nicht mit einer Zahl beginnen |
_variable_nummer | nicht ok, Name darf nicht mit einem Unterstrich beginnen |
variable_nummer | nicht ok |
# Zuordnung mit Gleichheitszeichen
> varname.1 = 1
> varname.1
[1] 1
# Zuordnung mit <-
> varname.2 <- 1
> varname.2
[1] 1
# Zuordnung mit ->
> "Kurs" -> varname.3
> varname.3
[1] "Kurs"
# Die Funktion ls() gibt eine Liste aller benutzten Variablen aus:
> ls()
[1] "alpha" "beta" "df0" "df1" "dg" "g" "x" "m" "M" "pk" "y"
# Die Funktion rm() loescht ueberfluessige Variabeln
> rm(x)
> ls()
[1] "alpha" "beta" "df0" "df1" "dg" "g" "m" "M" "pk" "y"
# Alles leer raeumen:
> rm(list=ls())
varname1<-'test1'
varname2<-'test2'
print(varname1)
print(varname2)
cat(varname1, varname2)
> seq(1,100)
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
[19] 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
[37] 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
[55] 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
[73] 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
[91] 91 92 93 94 95 96 97 98 99 100
> head(seq(1,100),2)
[1] 1 2
Beschreibung | Beispiel | Datentyp |
---|---|---|
Zeichenfolgen | "R Kurs" | character |
ganze und reele Zahlen | 1000 | numeric |
ganze Zahlen | 1L, 2L | integer |
komplexe Zahlen | 6.023x10exp23 | complex |
logische Werte | TRUE | logical |
leere Mengen | NULL | NULL |
> variable1 <- "R Kurs"
# Die Abfrage des Typs erfolgt mit class
> class(variable1)
> cat("Die variable1 hat den Typ", class(variable1), "\n")
Die variable1 hat den Typ character
> variable1 <- 1000L
> cat("Jetzt hat die variable1 den Typ", class(variable1), "\n")
Jetzt hat die variable1 den Typ integer
# Mit as.integer kann auch eine variable dem Typ integer zugeordnet werden:
> variable2 <- as.integer(1000)
> class(variable2)
[1] "integer"
# Variablen koennen ueberschrieben werden
> variable1 <- "Test"
> variable1 <- 10.7
> cat("Die variable1 hat den Typ", class(variable1), ".\n")
Die variable1 hat den Typ numeric.
var1 <- 10.7
var2<-10
var3 <- as.integer(var1)
var4 <- as.integer(var2)
# Im internen Speichermodus entspricht numeric
# double, Abfrage des internen Speichermodus mit typeof
> typeof(var1)
[1] "double"
Welche inneren und äußeren Typen haben die verwendeten Variablen?
# Variablen koennen durch rm geloescht werden
> var1 <- 1000
> rm(var1)
> var1
Fehler: Objekt 'var1' nicht gefunden
Viele Funktionen gehören zu R oder zu verschiedenen statistischen Paketen.
Funktionen werden z. B. zum ein- und auslesen von Daten, für statistische Zwecke oder zum Plotten von Daten verwendet.
Benutzerdefinierte Funktionen werden später besprochen.
# Summe von Zahlen mit sum()
> sum(1000, 1)
[1] 1001
# Mittelwert von Zahlen eines Vektors mit mean()
# (Vektoren werden spaeter besprochen)
> mean(c(1, 2, 3, 4, 5))
[1] 3
# Bilden der Quadratwurzel
> sqrt(49)
[1] 7
# Gebraeuchliche Logarithmen
# Logarithmus zur Basis 10
> log10(1000)
[1] 3
# Logarithmus zur Basis 2
> log2(64)
[1] 6
# natuerlicher Logarithmus
> log(100)
[1] 4.60517
# Bilden des Exponenten
> exp(4.60517)
[1] 99.99998
# NB.: Rundungsfehler!!
# Was gibt folgendes aus?
help(help)
'q' beendet die Hilfedarstellung.
R organisiert Daten in bestimmten Datenstrukturen,
z.B. Vektoren, Listen, Matrizen
# So erstellt man einen Vektor des Typs character
> print("Kurs")
[1] "Kurs"
# Der Vektor kann in einer Variablen abgelegt werden
> var1 <- ("Kurs")
[1] "Kurs"
# Abfrage ob var1 ein Vektor ist erfogt durch vorangestelltes "is."
> is.vector(var1)
[1] TRUE
# Ein bestimmter Dateityp kann durch vorangestelltes "as." erzwungen werden
> var2 <- pi
> var3 <- as.integer(var2)
> var3
[1] 3 # Hier erfolgt ein Informationsverlust!
> class(var3)
[1] "integer"
# Einen numerischen Vektor kann man auf unterschiedliche Arten erzeugen
> x <- c(1, 2, 3, 4, 5)
> x
[1] 1 2 3 4 5
> x <-seq(from = 1, to = 5, by = 1))
> x
[1] 1 2 3 4 5
> x <- c(1:5)
> x
[1] 1 2 3 4 5
# numerischer Vektor
> x <- c(1:100)
# "character" Vector
> x <- c("Ich", "brauche", "eine", "Pause")
> x
[1] "Ich" "brauche" "eine" "Pause"
# Boolean Vektor
> x <- c(FALSE, TRUE, T, F)
> x
[1] FALSE TRUE TRUE FALSE
> x <- c(1, 2, TRUE, "Kaffee")
> x
# Da alle Elemente des Vektors denselben Datentyp besitzen muessen, wird hiermit ein Vektor des Typs "Charakter" erzwungen.
>is.character(x)
[1] TRUE
# Kombinieren von Vektoren
> x <- c(1:5)
> y <- c(x, 6:10)
> y
[1] 1 2 3 4 5 6 7 8 9 10
> length(y)
[1] 10
> x <- rep(3, 12)
> x
[1] 3 3 3 3 3 3 3 3 3 3 3 3
> length(y)
[1] 12
> x <- c(1:5)
> y <- x*2
> y
[1] 2 4 6 8 10
> z <- x + x
> z
[1] 2 4 6 8 10
> z <- x ^2
> z
[1] 1 4 9 16 25
> mean(x)
[1] 3
> sum(x)
[1] 15
> x <- c(1:5)
> x[3] # indiziert das 3. Element des Vektors
[1] 3
> x[c(4, 1)] # indiziert das 4. und 1. Element des Vektors, Reihenfolge beachten!
[1] 4 1
> x[-c(4, 1)] # schliesst das 4. und 1. Element des Vektors aus
[1] 2 3 5
Typ | Dim | Mix | Named |
---|---|---|---|
Vector | 1 | FALSE | FALSE |
Matrix | 2 | FALSE | TRUE |
Data frame | 2 | TRUE (spaltenweise) | TRUE |
List | 1 (but...) | TRUE | FALSE |
Factor | 1 | FALSE | FALSE |
Array | n | FALSE | TRUE |
# Elemente werden Spaltenweise eingetragen
> x <- matrix(1:10, nrow = 2, ncol = 5)
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3 5 7 9
[2,] 2 4 6 8 10
# Elemente werden Zeilenweise eingetragen
> x <- matrix(1:10, nrow = 2, ncol = 5, byrow = TRUE)
> x
[,1] [,2] [,3] [,4] [,5]
[1,] 1 2 3 4 5
[2,] 6 7 8 9 10
# Jetzt werden den Zeilen und Spalten Namen gegeben
> rownames <- c("Zeile1", "Zeile2")
> colnames <- c("Spalte1", "Spalte2", "Spalte3", "Spalte4", "Spalte5")
> y <- matrix(1:10, nrow = 2, ncol = 5,
byrow = TRUE, dimnames = list(rownames, colnames))
> y
Spalte1 Spalte2 Spalte3 Spalte4 Spalte5
Zeile1 1 2 3 4 5
Zeile2 6 7 8 9 10
# Auslesen des Elements in Spalte3, Zeile 2
> print(y[2,3])
> [1] 8
Ähnlich lassen sich die Elemente einer gesamten Spalte oder Zeile adressieren.
# Auslesen der Elemente von Spalte4
> print(y[,4])
Zeile1 Zeile2
4 9
# Hier wird der Mittelwert aller Elemente in Zeile1 in Spalte1 bis Spalte3 berechnet
> print(mean(y[1,c(1, 2, 3)]))
# In einer Matrize haben alle Elemente denselben Datentyp
> x <- matrix(c(1:5, c("a", "b", "c", "d", "e")), 5, 2)
> x
[,1] [,2]
[1,] "1" "a"
[2,] "2" "b"
[3,] "3" "c"
[4,] "4" "d"
[5,] "5" "e"
> y <- x[2,1]
> class(y)
[1] "character"
# Wir definieren dieselben Daten als Dataframe
> d <- data.frame(ersteSpalte = 1:5, zweiteSpalte = c("a", "b", "c", "d", "e"))
ersteSpalte zweiteSpalte
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e
# Wir definieren das Dataframe
> data <- data.frame(Pflanzen_Nr =
c("At1", "At2", "At3", "At4", "At5"),
fertile_Samen = c(122, 345, 215, 90, 77),
StringsAsFactors = FALSE)
Pflanzen_Nr fertile_Samen
1 At1 122
2 At2 345
3 At3 215
4 At4 90
5 At5 77
> str(dfrm)
'data.frame': 5 obs. of 2 variables:
$ Pflanzen_Nr : chr "At1" "At2" "At3" "At4" ...
$ fertile_Samen: num 122 345 215 90 77
str() funktioniert übrigens nicht nur mit Dataframes.
> summary(data)
Pflanzen_Nr fertile_Samen
Length:5 Min. : 77.0
Class :character 1st Qu.: 90.0
Mode :character Median :122.0
Mean :169.8
3rd Qu.:215.0
Max. :345.0
> data$Bluehzeit_Tage <- c(5, 7, 6, 10, 8)
> data <- data
> data
Pflanzen_Nr fertile_Samen Bluehzeit_Tage
1 At1 122 5
2 At2 345 7
3 At3 215 6
4 At4 90 10
5 At5 77 8
# Zunaechst definieren wir ein neues Dataframe in demselben Format wie data
newdata <- data.frame(Pflanzen_Nr = c("At6", "At7", "At8"),
fertile_Samen = c(99, 45, 102), Bluehzeit_Tage = c (7, 11, 13),
stringsAsFactors = FALSE)
# Jetzt werden beide dataframes verbunden
> data_final <- rbind(data, newdata)
> print(data_final)
Pflanzen_Nr fertile_Samen Bluehzeit_Tage
1 At1 122 5
2 At2 345 7
3 At3 215 6
4 At4 90 10
5 At5 77 8
6 At6 99 7
7 At7 45 11
8 At8 102 13
# Hier werden die ersten beiden Zeilen des dataframes data_final extrahiert
> print(data_final[c(1, 2),])
Pflanzen_Nr fertile_Samen Bluehzeit_Tage
1 At1 122 5
2 At2 345 7
# Hier adressieren wir die Bluehzeit_Tage der Pflanzen At5 und At8
> print(data_final[c(5, 8), c(1, 3)])
Pflanzen_Nr Bluehzeit_Tage
5 At5 8
8 At8 13
# Wir definieren eine Liste, die einen Vektor und eine Matrix enthaelt.
# Beispiel ist die Expression von 3 Genen in drei Replikaten.
> neueListe <- list(c("WUSCHEL", "CLAVATA3", "TOPLESS"),
expr = matrix(c(101, 59, 120, 289, 310, 278, 789, 1020, 812),
nrow = 3, ncol = 3, byrow = TRUE))
> neueListe
[[1]]
[1] "WUSCHEL" "CLAVATA3" "TOPLESS"
$expr
[,1] [,2] [,3]
[1,] 101 59 120
[2,] 289 310 278
[3,] 789 1020 812
Listen können auch selbst wiederum Listen enthalten.
# Wir erzeugen einen Vektor mit den Kategorien
> genotype <- c("wildtype", "wildtype", "mutant", "wildtype", "mutant")
# Daraus wird ein Factor mit zwei Leveln:
> factor(genotype)
[1] wildtype wildtype mutant wildtype mutant
Levels: mutant wildtype
Kontrollkonstrukte und Schleifen sind wichtig in allen Programmiersprachen. Sie steuern den Programmablauf indem sie Fallunterscheidungen und Wiederholungen ermöglichen. Die wichtigsten Konstrukte für bedingte Anweisungen in R sind:
# Ist die Bedingung wahr (TRUE) wird Ausdruck1 ausgewertet,
# wenn die Bedingung falsch (FALSE) ist Ausdruck 2. Der andere Ausdruck wird jeweils
# nicht beruecksichtigt.
(1) if(Bedingung){Ausdruck1} else{Ausdruck2}
(2) ifelse(Bedingung, Ausdruck1, Ausdruck2)
> Uhrzeit <- "9 Uhr"
> Fruehstueck <- "9 Uhr"
> Mittagspause <- "12 Uhr"
> if(Uhrzeit == Mittagspause || Uhrzeit == Fruehstueck) {print("Pause")}
else{print("Weiter arbeiten")}
[1] "Weiter arbeiten"
> x <- c(1:10)
> ifelse(x > 5, ">5", "<=5")
[1] "<=5" "<=5" "<=5" "<=5" "<=5" ">5" ">5" ">5" ">5" ">5"
repeat{Ausdruck} | Wiederholung des Ausdrucks, erfolgt bis die Schleife angehalten wird |
while(Bedingung){Ausdruck} | Wiederholung des Ausdrucks solange die Bedingung erfüllt ist |
for(i in M){Ausdruck} | Wiederholung des Ausdrucks für jedes i der Menge M |
next | Sprung in den nächsten Wiederholungsschritt |
break | sofortiger Abbruch der Schleife |
# In diesem Beispiel wird 1 zu i addiert, bis der Wert 10 erreicht ist
> i <- 0
> repeat{
+ i <- i+1
+ print(i)
+ if(i == 10) break
+ }
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
# Beispiel zur Benutzung von while
# (bei einzeiligen Ausdruecken koennen die geschweiften Klammern unterbleiben.)
> i <- 0
> while(i < 10)
+ i <- i +1
> i
[1] 10
> i <- 0
> x <- c(1:10)
> for(i in x)
+ print(i + 1)
[1] 2
[1] 3
[1] 4
[1] 5
[1] 6
[1] 7
[1] 8
[1] 9
[1] 10
[1] 11
R kann Daten von ausserhalb der R Umgebung einlesen und ebenso kann eine Datenausgabe erfolgen.
Wichtig dafür ist, zu definieren und zu wissen in welchem Ordner gearbeitet wird. Zum setzen des Arbeitsordners wird der Befehl setwd() (für set working directory) benötigt. Will man nachfragen, in welchem Arbeitsordner man sich befindet, benötigt man getwd().
Die einfachste Funktion Daten in R einzulesen ist read.table(). Die Funktion ist geeignet zum Einlesen eines Datensatzes (dataframe), der in Tabellenform gespeichert ist.
> ?read.table()
read.table(file, header = FALSE, sep = "", quote = "\"'",
dec = ".", numerals = c("allow.loss", "warn.loss", "no.loss"),
row.names, col.names, as.is = !stringsAsFactors,
na.strings = "NA", colClasses = NA, nrows = -1,
skip = 0, check.names = TRUE, fill = !blank.lines.skip,
strip.white = FALSE, blank.lines.skip = TRUE,
comment.char = "#",
allowEscapes = FALSE, flush = FALSE,
stringsAsFactors = default.stringsAsFactors(),
fileEncoding = "", encoding = "unknown", text, skipNul = FALSE)
write.table(x, file = "", append = FALSE, quote = TRUE, sep = " ",
eol = "\n", na = "NA", dec = ".", row.names = TRUE,
col.names = TRUE, qmethod = c("escape", "double"),
fileEncoding = "")
?write.table
read.csv(file, header = TRUE, sep = ",", quote = "\"",
dec = ".", fill = TRUE, comment.char = "", ...)
read.csv2(file, header = TRUE, sep = ";", quote = "\"",
dec = ",", fill = TRUE, comment.char = "", ...)
read.delim(file, header = TRUE, sep = "\t", quote = "\"",
dec = ".", fill = TRUE, comment.char = "", ...)
read.delim2(file, header = TRUE, sep = "\t", quote = "\"",
dec = ",", fill = TRUE, comment.char = "", ...)
write.csv(...)
write.csv2(...)
Zur Dateiausgabe kann write.csv() verwendet werden.
?iris
iris {datasets}R Documentation
Edgar Anderson's Iris Data
Description
This famous (Fisher's or Anderson's) iris data set gives the measurements in
...
> head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
Sepal.L.. Sepal.W.. Petal.L.. Petal.W.. Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
> write.table(iris, file = "iris_data.txt", sep = " ")
> test <- read.table("iris_data.txt", header = TRUE, sep = " ")
> head(test)
Sepal.L.. Sepal.W.. Petal.L.. Petal.W.. Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa