cat("Hallo R Lover!")
#> Hallo R Lover!
Wer immer tut, was er schon kann, bleibt immer das, was er schon ist.
— Henry Ford
Zuerst kurze Darstellung, wie das Ganze hier aufgebaut ist, wie der Input(Codeblock), Output(Ergebnis), Hinweis, … aussehen, also die
Struktur
Der Input und Output für R und Python können nebeneinander oder in Tabsets, wobei R-Sourse in hellcyan und Python-Sourse in gelb dargestellt werden. Zeilenanfang im Output ist mit #>
belegt.
print("Hallo Python Lover!")
#> Hallo Python Lover!
Wo ich was Wichtiges zusagen habe, habe ich dementsprechend gefärbt und markiert:
Wenn ich was lerne, schreibe ich mir auf oder mache ich mir Notizen, ist nicht jedermanns Sache;). Hier gebe ich nur das wieder, was ich bei meinem Lernen verstanden habe und hoffe, dass das ein oder anderem, der R oder Python lernen möchte, von Interesse/Nutzen sein könnte. Die grammatische und/oder orthographischen Fehler im Text bitte ich vorab zu entschuldigen;). In diesem Sinne stelle ich zunächst vor,
Worum es geht
In diesem Stück geht es darum, was die Typen von Daten sind, warum sie unterschieden werden. Mehr werde ich versuchen, zu zeigen wie R und Python mit Datentypen umgehen. Ich habe mich auf Wichtige aus Richtigen konzentriert und habe versucht, die Datentypen mir aufzunehmen, mit denen man auch meistens zu tun haben könnte. Auf solche Datentypen, über die ich erstmal gelesen habe, wahrscheinlich auch zukunftig nicht brauchen werde wie komplexe Datentypen oder solche Raw Typen in R oder byts in Python, habe keine Beachtung geschenkt. Wie gesagt, habe ich mein Lernfokus auf die Datentypen, die ich für gebräuchlch halte, gelegt.
So möchte ich aber zuerst kurz erklären,
Was die Datentypen sind
Es geht darum, welche Unterscheidungsmöglichkeiten es zwischen verschiedenen Arten von Daten gibt und warum die Datentypen überhaupt unterschieden werden. Ich denke gleich an der Unterscheidung zwischen Zahlen und Zeichenketten, mit denen man im Alltag am meisten zu tun hat, wenn man mit Daten arbeitet. Die Unterscheidung ist auch insofern von Bedeutung, wenn wir mit den Daten weiter arbeiten, Berechnungen durchführen wollen. Dabei werden die Daten in Variablen gespeichert, damit das Programm diese Daten anprechen kann. Also der Komputer muss verstehen ob es sich z.B. um die Zahlen oder Text handelt, wenn er was damit anstellen muss. Diese Variable können wir in R oder Python Objekte
nennen. Der Typ dieser Objekte bestimmt, auf welche Art und Weise die Daten gespeichert und dargestellt werden. So ermöglicht beispielweise der Typ Integer eine ganze Zahl 42 als z.B var zu speichern und diese Zahl wird durch das Objekt var repräsentiert. Im Gegensatz zu vielen Programmiersprachen muss man bei Python und R den Typ nicht angeben oder deklarieren. Sie emitteln automatisch, um welchen Typ es sich handelt, wenn man ein Objekt erstellt. Daher fallen sie unter OOP(Object Oriented Programming)-Programmiersprachen.
Jetzt weiß ich mehr oder weniger, was Data Type ist . Im Folgenden handelt es sich um
Häufig verwendete Basic Data Types in Python und R
Wie ich oben gesagt habe, werden Daten sowohl in R als auch in Python als Objekte gespeichert. Jedes Objekt bekommt einen Namen durch Zuweisung eines Werts diesem Namen. So kann ich z.B. die Zahl 42 mit dem Namen val, oder das Wort “world” mit dem Namen txt speichern. R oder Python erkennt beispielweise, dass 42 eine Zahl ist, also numerisch. Diese Zahl kann als Integer dargestellt werden. Aber beim Speichern dieser numerischen Zahl verhalten sich Python und R anders, R speichert sie als numeric, was Gleitkommazahl oder Float ist. Wenn ich die Zahl als Integer haben will, muss ich R dazu zwingen. Python macht umgekehrt, speichert diese Zahl als int, wenn ich als Float haben will, muss ich den Typ angeben bzw umwandeln.
Hier ist ein Überblick über die gängigen Basic Data Types in Python und R (In Anlehnung an Wouter van Atteveldt 2022):
Example | Example | Description | ||
---|---|---|---|---|
integer | 42L | int | 42 | ganze Zahlen |
double | 42.33 | float | 42.33 | reelle Zahlen, Kommazahlen |
character | “Text” | str | “Text” | Zeichenketten, Texte |
logical | TRUE, FALSE | bool | True, False | die Wahrheitswerte |
Integer und Double werden in R als numeric zusammengefasst bzw. dargestellt. Aus der Tabelle kann ich sagen, dass ich mit drei grundlegenden gängigen Datentypen in Python und R am meisten zu tun habe. Das sind: numerische - zusammengesetzt aus Integer und Float, logische und textuelle Datentypen.
Jetzt gehen wir einzelne Typen durch.
integer/int
Integer stellt eine ganze Zahl dar, z.B. 7, -7. In R wird die ganze Zahl mit einem L
hinter der Zahl gekennzeichnet. Warum L dahinter stehen soll, weiß auch nicht;). R soll ja bekanntlich auf Programmiersprache C aufgebaut sein und da soll L für long integer stehen. In Python werden die ganze Zahlen normal als integer gespeichert.
R
<- 11L
ri1 <- -12L
ri2 <- 13.0
ri3 <- "123"
ri4 print(class(ri1))
#> [1] "integer"
print(class(ri2))
#> [1] "integer"
print(class(ri3))
#> [1] "numeric"
print(class(ri4))
#> [1] "character"
Python
= 11
pi1 = -12
pi2 = 13.0
pi3 = "123"
pi4 print(type(pi1))
#> <class 'int'>
print(type(pi2))
#> <class 'int'>
print(type(pi3))
#> <class 'float'>
print(type(pi4))
#> <class 'str'>
Um herauszufinden oder anzeigen zu lassen, welchen Typ ein Objekt hat, gibt es Funktion class()
in R und type()
in Python. In R werden Objekte mit <-
und in Python mit =
zugewiesen. Generell geht eas auch in R mit =
, aber mit Pfeil ist üblich
<-
or =
?
In R ist üblich, Objekte mit <-
zuzuweisen, während man in Python mit =
zuweist. Generell geht auch in R mit Gleichheitszeichen. Aber man bevorzugt Zuweisungspfeil. Gleichheitszeichen wird zur Zuweisung eher innerhalb einer Funktion benutzt. Hier eine kleine Demonstration:
Den Vektor von 1 bis 15 weise ich vec zu und rechne ich Summe:
sum(vec = 1:9)
#> [1] 45
Wenn ich das Objekt vec abfrage, kommt Fehlermeldung, weil dieses Objekt nur in der Funktion existiert:
print(vec)
#> Error in eval(expr, envir, enclos): Objekt 'vec' nicht gefunden
Das Gleiche mache ich mit <-
sum(vec <- 1:9)
#> [1] 45
print(vec)
#> [1] 1 2 3 4 5 6 7 8 9
Der Zuweisungspfeil wird aber meistens empfohlen und verwendet. Hier zum Nachlesen: Style guide von Hadley Wickham und hier: Google’s R Style Guide
\(~~\) – \(~~\) Prüfen, ob der Typ des Objekts integer ist
In R kann man den Typ des Objekts durch die Funktion is.integer()
oder inherits(object, "type")
prüfen.
R
# Check in R if a number is integer
is.integer(ri1) # Is 11L integer?
#> [1] TRUE
inherits(ri2, "integer") # Is -12 integer?
#> [1] TRUE
is.integer(ri3) # Is 13.0 integer?
#> [1] FALSE
is.integer(ri4) # Is "123" integer?
#> [1] FALSE
inherits(ri4, "character") # Is "123"character?
#> [1] TRUE
– in integer umwandeln
Wie gesagt, ohne L speichert R die Zahl als numeric, also als Kommazahl bzw. Float (Sieh Objekt ri3 im BSP oben). Ich muss R dazu bringen, dass er die Zahl als Integer behandelt. Dafür kann ich die Funktion as.integer()
benutzen.
R
show the code
# Making R treat the object as an integer
print(class(ri3)) # Type of 13.0
print(class(ri4)) # Type of "123"
print(class(as.integer(ri3))) # Forsing 13.0 to integer
print(class(as.integer(ri3))) # Forsing "123" to integer
print(class(FALSE)) # Type of FALSE
print(class(TRUE)) # Type of True
print(as.integer(FALSE)) # FALSE as Integer
print(as.integer(TRUE)) # TRUE as Integer
#> [1] "numeric"
#> [1] "character"
#> [1] "integer"
#> [1] "integer"
#> [1] "logical"
#> [1] "logical"
#> [1] 0
#> [1] 1
\(~~\) – \(~~\) Prüfen, ob der Typ des Objekts int ist Um zu prüfen gibt es in Python auch mehrere Wege: durch die Funktion isinstance(object, type)
(wie inherits(object, ""type")
bei R) oder kann mann auch prüfen, indem man den Objekttyp dem Datentyp gleichsetzt z.B. type(objekt) ==/is int()
. Es gibt auch die Funktion is_integer()
. Diese Funktion ist zum Checken, ob Float vom Typ Integer ist, bei anderer Typen funktioniert nicht, zumindest tat bei mir nicht. Außerdem braucht man dafür Modul sumpy, denkeich, worauf ich hier verzichtet habe. Daher habe ich nicht tief gesucht, denn ich kenne ja schon einen Weg, der nach Rom führt.
Python
# Check in Python if a number is integer
isinstance(pi1, int) # Is 11 integer?
#> True
type(pi2) == int # Is -12 integer?
#> True
isinstance(pi3, int) # Is 13.0 integer?
#> False
type(pi4) is int # Is '123' integer?
#> False
– in int umwandeln
Python speichrt die Zahlen als Integer. Wenn ich sie als Float will, muss ich den Typ umwandeln in Float. Wenn ich Daten von Typ z.B. Text, Float oder Logical habe, kann ich ihn umwandeln in Integer in Python, indem ich Objekt in die Funktion int()
übergebe.
Python
show the code
# Making Python treat the object as an integer
print(type(pi3)) # Type of 13.0
print(type(pi4)) # Type of "123"
print(type(int(pi3))) # Forsing 13.0 to integer
print(type(int(pi3))) # Forsing "123" to integer
print(type(False)) # Type of FALSE
print(type(True)) # Type of True
print(int(False)) # FALSE as Integer
print(int(True)) # TRUE as Integer
#> <class 'float'>
#> <class 'str'>
#> <class 'int'>
#> <class 'int'>
#> <class 'bool'>
#> <class 'bool'>
#> 0
#> 1
numeric/float
Die Kommazahlen mit Nachkommastellen sind die Floats. R speichert die Zahlen normalerweise als Float (ohne diese L nach der Zahl). Generell werden Zahlen in R als numeric
dargestellt. Sie können auch Integer oder Float sein. Beispielweise speichert R die Zahl 10 als Float, mit der Funktion class()
stellt er den Typ als numeric
dar. Es gibt auch noch eine Funktion in R, mit der man den Typ prüfen kann: typeof()
. Diese gibt den Typ von 10 als double
an, vermutlich kommt das auch von der C Sprache. Ich denke, durchs folgende Beispiel wird deutlicher, was ich meine;).
show the code
#> [1] "numeric"
#> [1] "double"
#> [1] "integer"
#> [1] "integer"
#> [1] "numeric"
#> [1] "double"
– Prüfen, ob der Typ des Objekts numeric/float ist
Wie beim Integer, kann man hier auch ähnliche Funktionen benutzen is.numeric()
oder is.double()
oder auch inherits(obj, "type")
für R, und gleiche wie oben für Python.
R
<- 3.14
rf1 <- 17
rf2 <- 20L
rf3 print(class(rf2)) # class()-Type of 17
#> [1] "numeric"
print(class(rf3)) # class()-Type of 20L
#> [1] "integer"
print(typeof(rf2)) # typeof()-Type of 17
#> [1] "double"
print(typeof(rf3)) # typeof()-Type of 20L
#> [1] "integer"
is.numeric(rf1) # Is 3.14 numeric?
#> [1] TRUE
is.double(rf2) # Is 17 double?
#> [1] TRUE
is.numeric(rf3) # Is 20L numeric?
#> [1] TRUE
is.integer(rf3) # Is 20L integer?
#> [1] TRUE
Python
= 3.14
pf1 = 17
pf2 = 20
pf3 print(type(pf1)) # Type of 3.14
#> <class 'float'>
print(type(pf2)) # Type of 17
#> <class 'int'>
print(type(pf3)) # Type of 20
#> <class 'int'>
isinstance(pf1, float)# Is 3.14 float?
#> True
isinstance(pf1, int) # Is 3.14 int?
#> False
type(pf2) is float # Is 17 float?
#> False
type(pf3) == float # Is 20 float?
#> False
isinstance(pf2, float)# Is 17 float?
#> False
– in numeric/float umwandeln
Das Gleiche gilt auch hier, wenn ich den Datentyp in numeric oder float haben will.
In R benutze ich dafur die Funktion as.numeric()
oder as.double
.
R
show the code
#> [1] "numeric"
#> [1] "integer"
#> [1] "numeric"
#> [1] "numeric"
#> [1] 0
#> [1] 1
In Python kann ich dies mit der Funktion float()
anstellen.
Python
show the code
#> <class 'int'>
#> <class 'int'>
#> <class 'float'>
#> <class 'float'>
#> 0.0
#> 1.0
character/str
Wie der Name schon sagt, solche Daten sind Strings, die Zeichen, Buchstaben enthalten. In R werden sie als character
und in Python als str
charakteresiert. Mit Strings hat man in der Praxis auch wie mit numerischen Daten häufig zu tun. Beispielweise können im zu analysierenden Datensatz auch kategoriale Variablen: “männlich”, “weiblich” vorhanden sein usw.
Strings können im doppelten Apostroph 'text'
oder in Anführungszeichen oder Gänsefüßchen "text"
angegeben werden/sein in R auch in Python. Die Funktion für die Länge des Strings ist für R: nchar()
und für Python len()
.
# Examples for Characters
rt1 <- "123"
rt2 <- "Hello"
rt3 <- "World"
glue::glue("Class of rt1: {class(rt1)}")
# Adding Strings
glue::glue("Mit der Funktion glue(): {rt2} {rt3}")
paste("Mit der Funktion paste():", rt2, rt3, sep = " ")
# Compare Strings
rt2 == "Hello"
rt2 == "HELLO"
rt1 == 123
# Length of String
glue("Länge von \"123\": {nchar(rt1)}")
glue("Länge von \"Hello\": {nchar(rt2)}")
#> Class of rt1: character
#> Mit der Funktion glue(): Hello World
#> [1] "Mit der Funktion paste(): Hello World"
#> [1] TRUE
#> [1] FALSE
#> [1] TRUE
#> Länge von "123": 3
#> Länge von "Hello": 5
R hat es schwer mit Zusammenaddieren von Strings und multiplizieren von Strings mit einer Zahl.
Wenn man in R zwei Strings zusammen addieren will oder String mit einer Zahl multiplizieren will, gibt R Error zurück, also kann es nicht. Vielleich gibt es irgendein Paket, das dies ermöglichen, müsste man mal schauen. Also einfach Addieren von zwei Strings wie in Python geht in R nicht. Mit der Funktion glue()
aus dem Paket glue
oder mit der Funktion paste
konnte ich zwei Strings zusammen addierend anzeigen lassen. Diese Funktion gibt es auch im Paket stringr
kann so angewendet werden: stringr::str_glue()
. Die Funktion glue("The value of text is {text})
ist wie f-String in Python print(f"The value of text is {text}")
.
+ rt2
rt1 #> Error in rt1 + rt2: nicht-numerisches Argument für binären Operator
* 3
rt3 #> Error in rt3 * 3: nicht-numerisches Argument für binären Operator
# Examples for Characters
pt1 = "123"
pt2 = "Hello"
pt3 = "world"
print(f"Type of pt1: {type(pt1)}")
# Adding Strings
print(pt2 + " " + pt3) # or
print(f"{pt2} {pt3}")
# Multiply a string by 3
pt3*3
# Compare
pt2 == "Hello"
pt2 == "HELLO"
pt1 == 123
# Length of String
print(f"Länge von \"123\": {len(pt1)}")
print(f"Länge von \"Hallo\": {len(pt2)}")
#> Type of pt1: <class 'str'>
#> Hello world
#> Hello world
#> 'worldworldworld'
#> True
#> False
#> False
#> Länge von "123": 3
#> Länge von "Hallo": 5
Strings sing ein umfangreiches Thema. Hier waren nur Sachen bezogen auf Datentyp. Vielleicht wird es zudem ein separates Notizbuch geben .
logical/bool
Die Objekt vom logischen Typ können die Werte WAHR/FALSCH oder 1/0 annehmen. Diese werden in R als logical
und in Python als bool
gespeichert. Schreibweisen unterscheiden sich auch, geschrieben bzw. dargestellt werden sie in R mit Großbuchstaben: TRUE/FALSE und in Python klein geschrieben mit Großbuchstaben am Anfang: True/False.
R
<- TRUE
rt <- FALSE
rf class(rt) # Type of TRUE
#> [1] "logical"
class(rf) # Type of FALSE
#> [1] "logical"
is.logical(rt) # Is TRUE logical
#> [1] TRUE
as.character(rt) # TRUE as character
#> [1] "TRUE"
as.character(rf) # FALSE as character
#> [1] "FALSE"
as.integer(rt) # TRUE as integer
#> [1] 1
as.integer(rf) # FALSE as integer
#> [1] 0
& rf # rt AND rf
rt #> [1] FALSE
| rf # rt OR rf
rt #> [1] TRUE
!rt # Is not TRUE
#> [1] FALSE
Python
= True
pt = False
pf type(pt) # Type of True
#> <class 'bool'>
type(pf) # Type of False
#> <class 'bool'>
type(pt) is bool # Is bool
#> True
str(pt) # True as String
#> 'True'
str(pf) # False as String
#> 'False'
int(pt) # True as Integer
#> 1
int(pf) # False as Integer
#> 0
and pf # pt AND pf
pt #> False
or pf # pt OR pf
pt #> True
not pt # Is not True
#> False
Hoffentlich ist mir gelungen, meine Notizen einigermaßen verständänlich und anständig darzustellen . Next Topic will be about data structures.