Datenrahmen sind wesentliche Datenstrukturen in der R -Programmiersprache. In diesem Tutorial diskutieren wir, wie Sie einen Datenrahmen in R. erstellen können
Ein Datenrahmen in R ist eine tabellarische (dh zweidimensionale, rechteckige) Datenstruktur, mit der die Werte eines beliebigen Datentyps gespeichert werden. Es handelt sich um eine Datenstruktur der Foundation R, was bedeutet, dass wir kein bestimmtes Paket installieren müssen, um Datenrahmen zu erstellen und damit zu arbeiten.
Wie in jeder anderen Tabelle besteht jeder Datenrahmen aus Spalten (darstellen Variablen oder Attribute) und Zeilen (darstellen Dateneinträge). In Bezug auf R spricht ein Datenrahmen, ist eine Liste von Vektoren gleicher Längeund gleichzeitig einer zweitdimensionalen Datenstruktur ähnelt sie einer R-Matrix, die sich in der folgenden Weise davon unterscheidet: Eine Matrix muss nur einen Datentyp enthalten, während ein Datenrahmen vielseitiger ist, da sie mehrere Datentypen haben kann. Während verschiedene Spalten eines Datenrahmens unterschiedliche Datentypen haben können, sollte jede Spalte vom gleichen Datentyp sein.
Erstellen eines Datenrahmens in R aus Vektoren
Um einen Datenrahmen in R aus einem oder mehreren Vektoren derselben Länge zu erstellen, verwenden wir die knowledge.body()
Funktion. Die grundlegendste Syntax ist wie folgt:
df <- knowledge.body(vector_1, vector_2)
Wir können so viele Vektoren über diese Funktion übergeben. Jeder Vektor repräsentiert eine DataFrame -Spalte, und die Länge eines jeden Vektors entspricht der Anzahl der Zeilen im neuen DataFrame. Es ist auch möglich, nur einen Vektor an die zu übergeben knowledge.body()
Funktion: In diesem Fall wird ein Datenrahmen mit einer einzelnen Spalte erstellt.
Eine Möglichkeit, einen R -Datenframe aus den Vektoren zu erstellen, besteht darin, zuerst jeden Vektor zu erstellen und sie dann alle in der erforderlichen Reihenfolge an die zu übergeben knowledge.body()
Funktion:
ranking <- 1:4
animal <- c('koala', 'hedgehog', 'sloth', 'panda')
nation <- c('Australia', 'Italy', 'Peru', 'China')
avg_sleep_hours <- c(21, 18, 17, 10)
super_sleepers <- knowledge.body(ranking, animal, nation, avg_sleep_hours)
print(super_sleepers)
ranking animal nation avg_sleep_hours
1 1 koala Australia 21
2 2 hedgehog Italy 18
3 3 sloth Peru 17
4 4 panda China 10
(Randnotiz: Genauer gesagt ist die Geographie von Igel und Faulen etwas breiter, aber lassen Sie uns nicht so wählerisch sein!)
Alternativ können wir alle Vektoren in der folgenden Funktion direkt zur Verfügung stellen:
super_sleepers <- knowledge.body(ranking=1:4,
animal=c('koala', 'hedgehog', 'sloth', 'panda'),
nation=c('Australia', 'Italy', 'Peru', 'China'),
avg_sleep_hours=c(21, 18, 17, 10))
print(super_sleepers)
ranking animal nation avg_sleep_hours
1 1 koala Australia 21
2 2 hedgehog Italy 18
3 3 sloth Peru 17
4 4 panda China 10
Wir haben den gleichen Datenrahmen wie im vorherigen Code. Beachten Sie die folgenden Funktionen:
- Die Vektoren für einen Datenrahmen können mit beiden erstellt werden
c()
Funktion (z. B., z. B.c('koala', 'hedgehog', 'sloth', 'panda')
) oder eine Reichweite (z. B., z. B.1:4
). - Im ersten Fall haben wir den Zuordnungsoperator verwendet
<-
Um die Vektoren zu erstellen. Im zweiten Fall haben wir den Argumentzuweisungsoperator verwendet=
. - In beiden Fällen wurden die Namen der Vektoren zu den Spaltennamen des resultierenden Datenrahmens.
- Im zweiten Beispiel können wir jeden Vektornamen in Anführungszeichen einbeziehen (z. B., z.
'ranking'=1:4
) Aber es ist nicht wirklich notwendig – das Ergebnis wird das gleiche sein.
Lassen Sie uns bestätigen, dass die Datenstruktur, die wir erhalten haben, tatsächlich ein Datenrahmen ist:
print(class(super_sleepers))
(1) "knowledge.body"
Lassen Sie uns nun seine Struktur untersuchen:
str(super_sleepers)
'knowledge.body': 4 obs. of 4 variables:
$ ranking : int 1 2 3 4
$ animal : Issue w/ 4 ranges "hedgehog","koala",..: 2 1 4 3
$ nation : Issue w/ 4 ranges "Australia","China",..: 1 3 4 2
$ avg_sleep_hours: num 21 18 17 10
Wir sehen das trotz der animal
Und nation
Vektoren sind ursprünglich Zeichenvektoren, die entsprechenden Spalten haben einen Faktor -Datentyp. Diese Konvertierung ist das Standardverhalten der knowledge.body()
Funktion. Um es zu unterdrücken, müssen wir einen optionalen Parameter hinzufügen stringsAsFactors
und setzen Sie es auf FALSE
:
super_sleepers <- knowledge.body(ranking=1:4,
animal=c('koala', 'hedgehog', 'sloth', 'panda'),
nation=c('Australia', 'Italy', 'Peru', 'China'),
avg_sleep_hours=c(21, 18, 17, 10),
stringsAsFactors=FALSE)
str(super_sleepers)
'knowledge.body': 4 obs. of 4 variables:
$ ranking : int 1 2 3 4
$ animal : chr "koala" "hedgehog" "sloth" "panda"
$ nation : chr "Australia" "Italy" "Peru" "China"
$ avg_sleep_hours: num 21 18 17 10
Jetzt sehen wir, dass die aus den Zeichenvektoren erstellten Spalten ebenfalls vom Charakterdatentyp stehen.
Es ist möglich, auch die Namen der Zeilen eines Datenrahmens hinzuzufügen (standardmäßig werden die Zeilen nur als aufeinanderfolgende Ganzzahl -Nummern ab 1 indexiert). Zu diesem Zweck verwenden wir einen optionalen Parameter row.names
wie folgt:
super_sleepers <- knowledge.body(ranking=1:4,
animal=c('koala', 'hedgehog', 'sloth', 'panda'),
nation=c('Australia', 'Italy', 'Peru', 'China'),
avg_sleep_hours=c(21, 18, 17, 10),
row.names=c('row_1', 'row_2', 'row_3', 'row_4'))
print(super_sleepers)
ranking animal nation avg_sleep_hours
row_1 1 koala Australia 21
row_2 2 hedgehog Italy 18
row_3 3 sloth Peru 17
row_4 4 panda China 10
Beachten Sie, dass in einem R -Datenfreame sowohl die Spaltennamen als auch die Zeilennamen (falls vorhanden) eindeutig sein müssen. Wenn wir versehentlich denselben Namen für zwei Spalten angeben, fügt R dem zweiten von ihnen automatisch ein Suffix hinzu:
# Including by mistake 2 columns known as 'animal'
super_sleepers <- knowledge.body(animal=1:4,
animal=c('koala', 'hedgehog', 'sloth', 'panda'),
nation=c('Australia', 'Italy', 'Peru', 'China'),
avg_sleep_hours=c(21, 18, 17, 10))
print(super_sleepers)
animal animal.1 nation avg_sleep_hours
1 1 koala Australia 21
2 2 hedgehog Italy 18
3 3 sloth Peru 17
4 4 panda China 10
Wenn wir stattdessen einen ähnlichen Fehler mit den Zeilennamen machen, macht das Programm einen Fehler:
# Naming by mistake 2 rows 'row_1'
super_sleepers <- knowledge.body(ranking=1:4,
animal=c('koala', 'hedgehog', 'sloth', 'panda'),
nation=c('Australia', 'Italy', 'Peru', 'China'),
avg_sleep_hours=c(21, 18, 17, 10),
row.names=c('row_1', 'row_1', 'row_3', 'row_4'))
print(super_sleepers)
Error in knowledge.body(ranking = 1:4, animal = c("koala", "hedgehog", "sloth", : duplicate row.names: row_1
Traceback:
1. knowledge.body(ranking = 1:4, animal = c("koala", "hedgehog", "sloth",
. "panda"), nation = c("Australia", "Italy", "Peru", "China"),
. avg_sleep_hours = c(21, 18, 17, 10), row.names = c("row_1",
. "row_1", "row_3", "row_4"))
2. cease(gettextf("duplicate row.names: %s", paste(distinctive(row.names(duplicated(row.names))),
. collapse = ", ")), area = NA)
Bei Bedarf können wir die Spalten eines Datenrahmens nach seiner Erstellung mit der Erstellung umbenennen names()
Funktion:
names(super_sleepers) <- c('col_1', 'col_2', 'col_3', 'col_4')
print(super_sleepers)
col_1 col_2 col_3 col_4
1 1 koala Australia 21
2 2 hedgehog Italy 18
3 3 sloth Peru 17
4 4 panda China 10
Erstellen eines Datenrahmens in R aus einer Matrix
Es ist möglich, einen R -Datenframe aus einer Matrix zu erstellen. JedochIn diesem Fall sind alle Werte eines neuen Datenrahmens vom gleichen Datentyp.
Nehmen wir an, wir haben die folgende Matrix:
my_matrix <- matrix(c(1, 2, 3, 4, 5, 6), nrow=2)
print(my_matrix)
(,1) (,2) (,3)
(1,) 1 3 5
(2,) 2 4 6
Wir können einen Datenrahmen mit demselben erstellen knowledge.body()
Funktion:
df_from_matrix <- knowledge.body(my_matrix)
print(df_from_matrix)
X1 X2 X3
1 1 3 5
2 2 4 6
Leider gibt es in diesem Fall keine Möglichkeit, die Spaltennamen direkt in der Funktion mit einigen optionalen Parametern direkt zu ändern (während wir die Zeilen ironischerweise immer noch umbenennen können, indem wir die verwenden row.names
Parameter). Da die Standardspaltennamen nicht beschreibend (oder zumindest aussagekräftig) sind, müssen wir ihn nach dem Erstellen des Datenrahmens beheben, indem wir die angewendet haben names()
Funktion:
names(df_from_matrix) <- c('col_1', 'col_2', 'col_3')
print(df_from_matrix)
col_1 col_2 col_3
1 1 3 5
2 2 4 6
Erstellen eines Datenrahmens in R aus einer Liste von Vektoren
Eine andere Möglichkeit, einen Datenrahmen in R zu erstellen, besteht darin, eine Liste von Vektoren zur Verfügung zu stellen knowledge.body()
Funktion. In der Tat können wir uns einen R -Datenframe als einen bestimmten Fall einer Liste von Vektoren vorstellen, in denen alle Vektoren gleich lang sind.
Nehmen wir an, wir haben die folgende Liste von Vektoren:
my_list <- listing(ranking=1:4,
animal=c('koala', 'hedgehog', 'sloth', 'panda'),
nation=c('Australia', 'Italy', 'Peru', 'China'),
avg_sleep_hours=c(21, 18, 17, 10))
print(my_list)
$ranking
(1) 1 2 3 4
$animal
(1) "koala" "hedgehog" "sloth" "panda"
$nation
(1) "Australia" "Italy" "Peru" "China"
$avg_sleep_hours
(1) 21 18 17 10
Jetzt möchten wir einen Datenrahmen daraus erstellen:
super_sleepers <- knowledge.body(my_list)
print(super_sleepers)
ranking animal nation avg_sleep_hours
1 1 koala Australia 21
2 2 hedgehog Italy 18
3 3 sloth Peru 17
4 4 panda China 10
Es ist wichtig, erneut zu betonen, dass jeder Vektor der angegebenen Liste die gleiche Anzahl von Elementen haben muss, um einen Datenrahmen aus einer Liste von Vektoren erstellen zu können. Andernfalls wirft das Programm einen Fehler auf. Zum Beispiel, wenn wir versuchen, „Koala“ beim Erstellen zu entfernen my_list
Wir werden es weiterhin schaffen, die Liste der Vektoren zu erstellen. Wenn wir jedoch versuchen, diese Liste zu verwenden, um einen Datenrahmen zu erstellen, erhalten wir einen Fehler.
Eine andere Sache, die hier zu beachten ist, ist, dass die Elemente der Liste sein sollten namens (Direkt beim Erstellen der Liste der Vektoren, genau wie wir oder später die Anwendung des names()
Funktion auf der Liste). Wenn wir dies nicht tun und eine Liste mit „namenlosen“ Vektoren an die übergeben knowledge.body()
Funktion erhalten wir einen Datenrahmen mit ziemlich bedeutungslosen Spaltennamen:
my_list <- listing(1:4,
c('koala', 'hedgehog', 'sloth', 'panda'),
c('Australia', 'Italy', 'Peru', 'China'),
c(21, 18, 17, 10))
super_sleepers <- knowledge.body(my_list)
print(super_sleepers)
X1.4 c..koala....hedgehog....sloth....panda..
1 1 koala
2 2 hedgehog
3 3 sloth
4 4 panda
c..Australia....Italy....Peru....China.. c.21..18..17..10.
1 Australia 21
2 Italy 18
3 Peru 17
4 China 10
Erstellen eines Datenrahmens in R aus anderen Datenrahmen
Wir können einen Datenrahmen in R erstellen, indem wir zwei oder mehr andere Datenrahmen kombinieren. Wir können dies horizontal oder vertikal tun.
Dataframe kombinieren horizontal (dh das Hinzufügen der Spalten eines Datenrahmens zu den Spalten des anderen) verwenden wir die cbind()
Funktion, wo wir den erforderlichen Datenrahmen übergeben.
Nehmen wir an, wir haben einen Datenrahmen, der nur die ersten beiden Spalten unserer enthält super_sleepers
Tisch:
super_sleepers_1 <- knowledge.body(ranking=1:4,
animal=c('koala', 'hedgehog', 'sloth', 'panda'))
print(super_sleepers_1)
ranking animal
1 1 koala
2 2 hedgehog
3 3 sloth
4 4 panda
Die zweiten 2 Spalten von super_sleepers
werden in einem anderen Datenrahmen gespeichert:
super_sleepers_2 <- knowledge.body(nation=c('Australia', 'Italy', 'Peru', 'China'),
avg_sleep_hours=c(21, 18, 17, 10))
print(super_sleepers_2)
nation avg_sleep_hours
1 Australia 21
2 Italy 18
3 Peru 17
4 China 10
Jetzt werden wir die anwenden cbind()
Funktionieren Sie, um sowohl DataFrame zu verkettet als auch die Preliminary zu erhalten super_sleepers
Datenrahmen:
super_sleepers <- cbind(super_sleepers_1, super_sleepers_2)
print(super_sleepers)
ranking animal nation avg_sleep_hours
1 1 koala Australia 21
2 2 hedgehog Italy 18
3 3 sloth Peru 17
4 4 panda China 10
Beachten Sie, dass der Datenrahmen die gleiche Anzahl von Zeilen haben muss, um den obigen Betrieb erfolgreich auszuführen. Andernfalls werden wir einen Fehler bekommen.
In ähnlicher Weise zum Kombinieren von DataFrame vertikal (IE, das Hinzufügen der Zeilen eines Datenrahmens zu den Zeilen des anderen), verwenden wir die rbind()
Funktion, wo wir den erforderlichen Datenrahmen übergeben.
Nehmen wir an, wir haben einen Datenrahmen, der nur die ersten beiden Reihen von enthält super_sleepers
:
super_sleepers_1 <- knowledge.body(ranking=1:2,
animal=c('koala', 'hedgehog'),
nation=c('Australia', 'Italy'),
avg_sleep_hours=c(21, 18))
print(super_sleepers_1)
ranking animal nation avg_sleep_hours
1 1 koala Australia 21
2 2 hedgehog Italy 18
Ein weiterer Datenrahmen enthält die letzten beiden Zeilen von super_sleepers
:
super_sleepers_2 <- knowledge.body(ranking=3:4,
animal=c('sloth', 'panda'),
nation=c('Peru', 'China'),
avg_sleep_hours=c(17, 10))
print(super_sleepers_2)
ranking animal nation avg_sleep_hours
1 3 sloth Peru 17
2 4 panda China 10
Lassen Sie uns sie vertikal mit dem kombinieren rbind()
Funktion, um unseren ersten Datenrahmen zu erhalten:
super_sleepers <- rbind(super_sleepers_1, super_sleepers_2)
print(super_sleepers)
ranking animal nation avg_sleep_hours
1 1 koala Australia 21
2 2 hedgehog Italy 18
3 3 sloth Peru 17
4 4 panda China 10
Beachten Sie, dass die Datenrahmen die gleiche Anzahl von Spalten haben müssen, um diesen Vorgang erfolgreich auszuführen und Die gleichen Spaltennamen in derselben Reihenfolge. Andernfalls werden wir einen Fehler bekommen.
Erstellen eines leeren Datenrahmens in R.
In einigen Fällen müssen wir möglicherweise einen leeren R-Datenframe mit nur Spaltennamen und Spaltendatentypen und ohne Zeilen erstellen-um später mit einem For-Loop zu füllen. Zu diesem Zweck bewerben wir uns erneut die knowledge.body()
Funktion wie folgt:
super_sleepers_empty <- knowledge.body(ranking=numeric(),
animal=character(),
nation=character(),
avg_sleep_hours=numeric())
print(super_sleepers_empty)
(1) ranking animal nation avg_sleep_hours
<0 rows> (or 0-length row.names)
Überprüfen Sie die Datentypen der Spalten unseres neuen leeren Datenframees:
str(super_sleepers_empty)
'knowledge.body': 0 obs. of 4 variables:
$ ranking : num
$ animal : Issue w/ 0 ranges:
$ nation : Issue w/ 0 ranges:
$ avg_sleep_hours: num
Wie wir bereits gesehen haben, sind die Spalten, die wir vom Charakter -Datentyp haben möchten, aufgrund der von der durchgeführten Standardkonvertierung tatsächlich vom Faktor -Datentyp knowledge.body()
Funktion. Wie früher können wir es beheben, indem wir einen optionalen Parameter einführen stringsAsFactors=FALSE
:
super_sleepers_empty <- knowledge.body(ranking=numeric(),
animal=character(),
nation=character(),
avg_sleep_hours=numeric(),
stringsAsFactors=FALSE)
str(super_sleepers_empty)
'knowledge.body': 0 obs. of 4 variables:
$ ranking : num
$ animal : chr
$ nation : chr
$ avg_sleep_hours: num
Notiz: Hinzufügen der
stringsAsFactors=FALSE
Parameter ist immer eine gute Praxis bei der Anwendung derknowledge.body()
Funktion. Wir haben es in diesem Tutorial nicht viel verwendet, sondern nur um das Überladen des Codes zu vermeiden und sich auf die Hauptdetails zu konzentrieren. Bei realen Aufgaben sollten Sie jedoch immer in Betracht ziehen, diesen Parameter hinzuzufügen, um das unerwünschte Verhalten von Datenrahmen zu verhindern, die den Zeichendatentyp enthalten.
Eine andere Möglichkeit, einen leeren Datenrahmen in R zu erstellen, besteht darin, eine leere „Kopie“ eines anderen Datenrahmens (praktisch bedeutet, dass wir nur die Spaltennamen und deren Datentypen kopieren).
Lassen Sie uns unser Authentic neu erstellen super_sleepers
(Diesmal mit dem stringsAsFactors=FALSE
Parameter):
super_sleepers <- knowledge.body(ranking=1:4,
animal=c('koala', 'hedgehog', 'sloth', 'panda'),
nation=c('Australia', 'Italy', 'Peru', 'China'),
avg_sleep_hours=c(21, 18, 17, 10),
stringsAsFactors=FALSE)
print(super_sleepers)
ranking animal nation avg_sleep_hours
1 1 koala Australia 21
2 2 hedgehog Italy 18
3 3 sloth Peru 17
4 4 panda China 10
Erstellen Sie nun eine leere Vorlage davon als neuer Datenrahmen mit der folgenden Syntax:
super_sleepers_empty <- super_sleepers(FALSE, )
print(super_sleepers_empty)
(1) ranking animal nation avg_sleep_hours
<0 rows> (or 0-length row.names)
Lassen Sie uns überprüfen, ob die Datentypen der Originaldatenfream-Spalten im neuen leeren Datenfreame erhalten bleiben:
str(super_sleepers_empty)
'knowledge.body': 0 obs. of 4 variables:
$ ranking : int
$ animal : chr
$ nation : chr
$ avg_sleep_hours: num
Schließlich können wir einen leeren Datenrahmen aus einer Matrix ohne Zeilen und der erforderlichen Anzahl von Spalten erstellen und dann die entsprechenden Spaltennamen zuweisen:
columns= c('ranking', 'animal', 'nation', 'avg_sleep_hours')
super_sleepers_empty = knowledge.body(matrix(nrow=0, ncol=size(columns)))
names(super_sleepers_empty) = columns
print(super_sleepers_empty)
(1) ranking animal nation avg_sleep_hours
<0 rows> (or 0-length row.names)
Ein potenzieller Nachteil des letzten Ansatzes ist, dass die Datentypen der Spalten von Anfang an nicht festgelegt werden:
str(super_sleepers_empty)
'knowledge.body': 0 obs. of 4 variables:
$ ranking : logi
$ animal : logi
$ nation : logi
$ avg_sleep_hours: logi
Lesen Sie einen Datenrahmen in R aus einer Datei
Abgesehen von der Erstellung eines Datenrahmens in R von Grund auf können wir einen bereits vorhandenen Datensatz in tabellarischer Type importieren und als Datenrahmen speichern. In der Tat ist dies der häufigste Weg, um einen R-Datenframe für reale Aufgaben zu erstellen.
Um zu sehen, wie es funktioniert, laden wir einen Kaggle -Datensatz herunter Orangen gegen Grapefruit Speichern Sie es auf unserem lokalen Laptop im selben Ordner wie dieses Pocket book, und lesen Sie es als neuen Datenframe citrus
und visualisieren Sie die ersten sechs Zeilen des Datenrahmens. Da existiert der ursprüngliche Datensatz als CSV Datei, wir verwenden die learn.csv()
Funktion zum Lesen:
citrus <- learn.csv('citrus.csv')
print(head(citrus))
title diameter weight pink inexperienced blue
1 orange 2.96 86.76 172 85 2
2 orange 3.91 88.05 166 78 3
3 orange 4.42 95.17 156 81 2
4 orange 4.47 95.60 163 81 4
5 orange 4.48 95.76 161 72 9
6 orange 4.59 95.86 142 100 2
Notiz: Es ist nicht obligatorisch, die heruntergeladene Datei im selben Ordner wie das arbeitende Notizbuch zu speichern. Wenn die Datei an einem anderen Ort gespeichert wird, müssen wir lediglich den gesamten Weg dazu anstelle des Namens der Datei (z.
'C:/Customers/Consumer/Downloads/citrus.csv'
). Das Speichern der Datensatzdatei in derselben Datei wie das Arbeits -R -Pocket book ist jedoch eine gute Praxis.
Der obige Code liest den Datensatz 'citrus.csv'
in den Datenrahmen aufgerufen citrus
.
Es ist auch möglich, andere Arten von Dateien zu lesen, anstatt andere Dateien zu lesen, anstatt CSV. In anderen Fällen können wir die Funktionen nützlich finden learn.desk()
(Zum Lesen einer tabellarischen Daten), learn.delim()
(für Registerkartendelimited Textdateien) und learn.fwf()
(Für Dateien mit fester Breite).
Abschluss
In diesem Tutorial haben wir untersucht, wie Sie einen Datenrahmen in R erstellen: Aus einem oder mehreren Vektoren aus einer Matrix aus einer Liste von Vektoren, die andere Datenrahmen horizontal oder vertikal kombinieren, einen verfügbaren tabulären Datensatz lesen und einem neuen Datenrahmen zuweisen. Darüber hinaus haben wir die drei verschiedenen Arten zur Erstellung eines leeren Datenrahmens in R und wenn diese Ansätze anwendbar sind. Wir haben besondere Aufmerksamkeit auf die Syntax von Code und seine Variationen, technischen Nuancen, gute und schlechte Praktiken, mögliche Fallstricke und Problemumgehungen gelegt, um sie zu beheben oder zu vermeiden.