Datenumformung in der R-Sprache (Konvertierung langer und breiter Tabellen)

Studiennotizen sind nur für Studienzwecke bestimmt.

Inhaltsverzeichnis

1- Was sind saubere Daten?

2-breiter Tisch wird zum langen Tisch 

Beispiel 1:

Beispiel 2:

Beispiel 3:

3- langer Tisch mit variabler Breite

Beispiel 1:

Beispiel 2:

1- Was sind saubere Daten?

Laut Hadley weisen saubere Daten die folgenden Merkmale auf:

  1. Jede Variable bildet eine Spalte, dh Variablen mit denselben Attributen bilden eine Spalte.
  2. Jede Beobachtung bildet eine Zeile;
  3. Jeder Variablenwert für jede Beobachtung stellt eine Zelle dar;

Daten, die die oben genannten Bedingungen nicht erfüllen, werden als schmutzige und unordentliche Daten bezeichnet und weisen häufig die folgenden Merkmale auf:

  1. Spaltennamen sind keine Variablennamen, sondern Werte;
  2. Fügen Sie mehrere Variablen in eine Spalte ein.
  3. Variablen werden sowohl in Zeilen als auch in Spalten platziert;
  4. Mehrere Arten von Beobachtungseinheiten befinden sich in derselben Zelle, d. h. jede Zelle ist kein Wert;
  5. Eine Beobachtungseinheit wird in mehreren Tischen platziert;

Datenumformung : Die Funktionen in der Tidyverse-Reihe von Paketen arbeiten mit sauberen Datenrahmen, und unordentliche Daten müssen zuerst in saubere Daten umgewandelt werden. Dieser Prozess ist Datenumformung;

Die Datenumformung umfasst : Längen-Breite-Tabellenkonvertierung, Teilen/Zusammenführen von Spalten und Quadrat. Unter anderem werden bei der Transformation der Längen- und Breitentabelle die Funktionen „pivot_longer()“ und „pivot_wider()“ verwendet

Beispiel und Beschreibung für schmutzige Daten:

In diesem Beispiel gehören sowohl männlich als auch weiblich zum Geschlecht, sodass männlich und weiblich als eine Variable klassifiziert werden können. Eine Spalte ist eine Variable und verstößt gegen die erste der Anforderungen an saubere Daten.

 Da in diesem Beispiel die beiden Variablen Alter und Gewicht in einer Spalte platziert sind, obwohl sie durch Backslashes getrennt sind, ist es für Menschen mit gesundem Menschenverstand leicht zu verstehen, aber der Computer versteht es nicht, sondern sagt nur, dass die beiden Spalten sind ursprünglich numerische Daten und werden als Zeichenfolgen behandelt, was gegen die dritte Regel ordentlicher Daten verstößt, dass jede Variable für jede Beobachtung eine Zelle darstellt.

 In diesem Beispiel ist keine der drei Anforderungen für saubere Daten erfüllt.

Der Schlüssel zum Aufräumen von Daten besteht darin, zu lernen, Variablen, Beobachtungen und Werte zu unterscheiden.

2-breiter Tisch wird zum langen Tisch 

Breite Tabelle: Bezieht sich auf den Datensatz, der alle Variablen klar unterteilt. Die Tabelle ist relativ breit. Der Wert, der in die Zelle hätte eingefügt werden sollen, wird in den Spaltennamen eingefügt, z. B. männlich und weiblich, die in die Zelle eingefügt werden sollen . Der Inhalt der Spalte ist zum Spaltennamen von zwei bestimmten Spalten geworden.

Lange Tabelle: Bezieht sich auf Daten, die kategoriale Variablen im Datensatz enthalten.

Verwenden Sie die Funktion „pivot_longer()“ im Paket „tidyr“, um eine breite Tabelle in eine lange Tabelle umzuwandeln, und verwenden Sie die Funktion „pivot_wider()“, um eine lange Tabelle in eine breite Tabelle umzuwandeln. Dies ist die umgekehrte Transformation der Funktion „pivot_longer()“.

Grammatikeinführung:

Pivot_longer(Daten, Spalten, Namen_zu, Werte_zu, Werte_Drop_na, ...)

In

  • Daten: der umzuformende Datenrahmen;
  • cols: Wählen Sie mit der Select-Spalten-Syntax die zu verformende Spalte aus, dh die zu verarbeitende Spalte.
  • Namen_to: Legen Sie den Spaltennamen fest. Um den Spaltennamen der zu verarbeitenden Spalte zu speichern, erstellen Sie eine neue Spalte oder mehrere Spalten (je nach spezifischem Problem) und legen Sie einen neuen Spaltennamen für die neu erstellte Spalte fest.
  • Werte_to: Legen Sie den Spaltennamen fest, insbesondere speichern Sie die zu verarbeitende Spalte und den Wert in der Zelle darunter und legen Sie einen neuen Spaltennamen für diese Spalte fest.
  • Values_drop_na: Ob fehlende Werte in deformierten Spalten ignoriert werden sollen (NA, nicht verfügbar)
  • Wenn der Spaltenname der deformierten Spalte zusätzlich zum gewünschten „Inhalt“ Präfixe, Variablennamen + Trennzeichen und Erfassungsmuster für reguläre Ausdrucksgruppen enthält, können Sie die Parameter „names_prefix“, „names_sep“ und „names_pattern“ verwenden, um den gewünschten „Inhalt“ zu extrahieren. Beachten Sie, dass sich der „Inhalt“ hier auf den gewünschten Teil des Spaltennamens bezieht.

Beispiel 1 :

Breite Tabelle mit variabler Länge ( Speichern Sie den Spaltennamen der umzuformenden Spalte in einer Spalte)

> df <- read.csv("配套数据/分省年度GDP.csv")
> df
      地区  X2019年  X2018年  X2017年
1   北京市 35371.28 33105.97 28014.94
2   天津市 14104.28 13362.92 18549.19
3   河北省 35104.52 32494.61 34016.32
4 黑龙江省 13612.68 12846.48 15902.68


> df %>%
+   pivot_longer(-地区, names_to = "年份", values_to="GDP")
# A tibble: 12 × 3
   地区     年份       GDP
   <chr>    <chr>    <dbl>
 1 北京市   X2019年 35371.
 2 北京市   X2018年 33106.
 3 北京市   X2017年 28015.
 4 天津市   X2019年 14104.
 5 天津市   X2018年 13363.
 6 天津市   X2017年 18549.
 7 河北省   X2019年 35105.
 8 河北省   X2018年 32495.
 9 河北省   X2017年 34016.
10 黑龙江省 X2019年 13613.
11 黑龙江省 X2018年 12846.
12 黑龙江省 X2017年 15903.

df ist eine breite Tabelle. Mit Ausnahme der Regionsspalte sind alle verbleibenden Spalten die Spalten, die wir umformen möchten. In der Funktion „pivot_longer()“ ist der erste Parameter der Datenrahmen, den wir verarbeiten möchten, da hier die Pipeline-Operation verwendet wird Daher wird der erste Parameter dieser Funktion weggelassen, der zweite Parameter ist die Spalte, die umgestaltet werden soll. Dies bedeutet hier, dass mit Ausnahme der Region alle verbleibenden Spalten das sind, was wir umformen möchten. Der dritte Parameter name_to= „Jahr“ gibt an Spalte, die wir in den Originaldaten umformen möchten. Der Spaltenname dieser Spalte wird in einer neuen Spalte gespeichert. Wir verwenden „names_to“, um der neuen Spalte einen Spaltennamen zu geben. Benennen Sie in diesem Fall die neue Spalte nach „Jahr“. Der vierte Parameter ist „values_to="GDP"“ und gibt die Spalte an, die wir in den Originaldaten umformen möchten. Der in der Zelle dieser Spalte gespeicherte Wert wird nun in einer neuen Spalte platziert. Wir müssen einen Spaltennamen für diese neue Spalte übernehmen , die Spalte heißt „BIP“.

Wie aus diesem Beispiel ersichtlich ist, formen wir die Spalten um, extrahieren die Spaltennamen dieser umgeformten Spalten, fügen sie in die Zellen einer neuen Spalte ein und wiederholen sie in einem Zyklus, dh x2019, x2018 und x2017 sind a Zyklus.

Beispiel 2 :

Breite Tabelle mit variabler Länge ( speichert den Spaltennamen der umzuformenden Spalte in mehreren Spalten)

Rohdaten: breite Tabelle

 Das Ziel wird in die folgende lange Tabelle umgewandelt

analysieren:

Mit diesen Daten werden die Informationen jedes Familienkindes erfasst. Beispielsweise gibt es in Familie 1 zwei Kinder, Kind1 und Kind2, und das Geburtsdatum und das Geschlecht dieser Kinder werden erfasst.

In den Originaldaten sind die Spalten, die wir umformen möchten, alle Spalten mit Ausnahme der Familienspalte. Die Spaltennamen dieser Spalten werden durch Unterstriche getrennt. Wir möchten die Daten in drei Spalten umwandeln, nämlich Kinderspalte, Geburtsdatum und Geschlecht Geschlecht. Unter diesen bleiben die beiden Spalten Geburtsdatum und Geschlecht unverändert. Ohne Operation werden Kind1 und Kind2 zu einer neuen Spalte und nennen diese Spalte Kind.

> load("配套数据/family.rda")
> knitr::kable(family, align="c")


| family | dob_child1 | dob_child2 | gender_child1 | gender_child2 |
|:------:|:----------:|:----------:|:-------------:|:-------------:|
|   1    | 1998-11-26 | 2000-01-29 |       1       |       2       |
|   2    | 1996-06-22 |     NA     |       2       |      NA       |
|   3    | 2002-07-11 | 2004-04-05 |       2       |       2       |
|   4    | 2004-10-10 | 2009-08-27 |       1       |       1       |
|   5    | 2000-12-05 | 2005-02-28 |       2       |       1       |
> 
> family %>%
+   pivot_longer(-family,
+                names_to = c(".value", "child"),
+                names_sep="_",
+                values_drop_na = TRUE)
# A tibble: 9 × 4
  family child  dob        gender
   <int> <chr>  <date>      <int>
1      1 child1 1998-11-26      1
2      1 child2 2000-01-29      2
3      2 child1 1996-06-22      2
4      3 child1 2002-07-11      2
5      3 child2 2004-04-05      2
6      4 child1 2004-10-10      1
7      4 child2 2009-08-27      1
8      5 child1 2000-12-05      2
9      5 child2 2005-02-28      1

Code-Erklärung:

  • -Familie gibt an, dass die zu verformende Spalte eine andere Spalte als die Familienspalte ist.
  • .names_sep="_" gibt an, dass die Spaltennamen der umgeformten Spalten durch Unterstriche getrennt sind.
  • name_to=c(".value", "child") wird verwendet, um die Spaltennamen der neu erstellten Spalten in der langen Tabelle festzulegen. Konkret wird der Spaltenname der umzugestaltenden Spalte durch Unterstriche in zwei Teile geteilt, der erste Teil ist das Geburtsdatum und das Geschlecht und der zweite Teil ist Kind 1 und Kind 2.
    • Die vom ersten Teil generierten Spalteninformationen (Spaltenname + Zellinhalt darunter) bleiben unverändert;
    • „Kind“ ist der Spaltenname der neu erstellten Spalte, der zum Speichern des Inhalts des zweiten Teils des umzugestaltenden Spaltennamens verwendet wird, nämlich Kind 1 und Kind 2.
    • Values_drop_na=TRUE: Gibt an, dass der fehlende Wert NA in der zu verformenden Spalte bei der Datenumformung ignoriert wird.

Beispiel 3:

Breite Tabelle mit variabler Länge ( speichert den Spaltennamen der umzuformenden Spalte in mehreren Spalten)

Rohdaten-weite Tabelle

 Ziel: Konvertieren Sie in eine lange Tabelle in der folgenden Form

> df <- read.csv("配套数据/参赛队信息.csv")
> df
  队员1姓名 队员1专业 队员2姓名 队员2专业 队员3姓名 队员3专业
1      张三      数学      李四      英语      王五    统计学
2      赵六    经济学      钱七      数学      孙八    计算机
> 
> df %>%
+   pivot_longer(everything(),
+                names_to=c("队员", ".value"),
+                names_pattern = "(.*\\d)(.*)")
# A tibble: 6 × 3
  队员  姓名  专业  
  <chr> <chr> <chr> 
1 队员1 张三  数学  
2 队员2 李四  英语  
3 队员3 王五  统计学
4 队员1 赵六  经济学
5 队员2 钱七  数学  
6 队员3 孙八  计算机

 Grammatikerklärung:

  • Everything (): Zeigt an, dass alle Spalten ausgewählt sind, dh alle umzuformenden Spalten sind Spalten.
  • name_pattern= "(.*\\d)(.*)" : Verwenden Sie diesen Parameter und regulären Ausdruck für die Gruppenerfassung. \\d bedeutet übereinstimmende Zahlen, also 0-9, * bedeutet jedes Zeichen, jeden Buchstaben, jede Zahl außer Newline, * stimmt mindestens einmal überein.
  • Name_to = c („Teammitglied“, „.Wert“) gibt den Spaltennamen der neu erstellten Spalte an. Der Spaltenname der neu erstellten Spalte lautet „Teammitglied“ und die verbleibenden Spalten und Informationen bleiben unverändert. Konkret wird der Spaltenname der umzuformenden Spalte mithilfe eines regulären Ausdrucks in zwei Teile geteilt. Der Inhalt des ersten Teils ist child1, child2. Hier wird eine neue Spalte für den ersten Teil des Spaltennamens erstellt und der Der Spaltenname der neuen Spalte wird auf „child“ festgelegt. Der zweite Teil besteht aus Spalteninformationen (Spaltenname und Zellteil bleiben unverändert. In diesem Beispiel gibt es beispielsweise zwei Spaltennamen im zweiten Teil, „name“ und „major“) Spalten bleiben unverändert, behalten Sie den ursprünglichen Spaltennamen und den Zelleninhalt unter der Spalte bei )

3- langer Tisch mit variabler Breite

Verwenden Sie die Funktion „pivot_wider()“ im Paket „tidyr“, um lange und breite Tabellen zu implementieren

Pivot_wider(Daten, ID_Spalten, Namen_von, Werte_von, Werte_Füllung,...)

In:

  • Daten: Gibt den Datenrahmen an, der umgestaltet werden soll.
  • id_cols: Die Spalte, die die Beobachtung eindeutig identifiziert. Der Standardwert ist eine andere Spalte als die durch „names_from“ und „values_from“ angegebenen Spalten.
  • Namen_von: Gibt an, aus welcher Variablenspalte der Spaltenname stammt.
  • Werte_von: Gibt an, aus welcher Variablenspalte der Spaltenwert stammt
  • Werte_Füllung: Wenn der Zellenwert korrekt ist, nachdem die Tabelle erweitert wurde, welcher Wert sollte zum Füllen festgelegt werden.
  • Es gibt auch Parameter, die dabei helfen, Spaltennamen zu korrigieren: „names_prefix“, „names_sep“, „names_glue“.

Beispiel 1:

Es gibt nur einen Spaltennamen und einen Spaltenwert. 

Spaltenname: aus der Spalte Typ

Spaltenwert: aus der Spalte „Heads“.

In aufgeräumten Daten können Sie den Spaltennamen verwenden, um auf die Informationen für diese gesamte Spalte zuzugreifen.

> load("配套数据/animals.rda")
> animals
# A tibble: 228 × 3
   Type    Year  Heads
   <chr>  <int>  <dbl>
 1 Sheep   2015 24943.
 2 Cattle  1972  2189.
 3 Camel   1985   559 
 4 Camel   1995   368.
 5 Camel   1997   355.
 6 Goat    1977  4411.
 7 Cattle  1979  2477.
 8 Cattle  2014  3414.
 9 Cattle  1996  3476.
10 Cattle  2017  4388.
# ℹ 218 more rows
# ℹ Use `print(n = ...)` to see more rows
> 
> animals %>%
+   pivot_wider(names_from=Type, values_from=Heads, values_fill = 0)
# A tibble: 48 × 6
    Year  Sheep Cattle Camel   Goat Horse
   <int>  <dbl>  <dbl> <dbl>  <dbl> <dbl>
 1  2015 24943.  3780.  368. 23593. 3295.
 2  1972 13716.  2189.  625.  4338. 2239.
 3  1985 13249.  2408.  559   4299. 1971 
 4  1995     0   3317.  368.  8521. 2684.
 5  1997 14166.  3613.  355. 10265. 2893.
 6  1977 13430.  2388.  609   4411. 2104.
 7  1979 14400.  2477.  614.  4715. 2079.
 8  2014 23215.  3414.  349. 22009.    0 
 9  1996 13561.  3476.  358.  9135. 2770.
10  2017 30110.  4388.  434. 27347. 3940.
# ℹ 38 more rows
# ℹ Use `print(n = ...)` to see more rows

Sie können sehen, dass der Wert in der ersten Spalte „Art“ der Originaldaten der Tiere wiederholt wird. Der Zellinhalt in dieser Spalte, also die Art des Tieres, wird als neue Variable verwendet. Wenn es mehrere Arten gibt, erstellen Sie mehrere Spalten und verwenden name_from Geben Sie an, aus welcher Spalte der Originaldaten der neu erstellte Spaltenname stammt. Der hier verwendete Spaltenname des Datenrahmens gibt an, dass auf die Informationen dieser Spalte (Spaltenname + Zelleninhalt) zugegriffen werden kann, und value_from wird verwendet um die Zelle der neu erstellten Spalte anzugeben. Aus welcher Spalte der Originaldaten der Inhalt stammt.

Beispiel 2:

Es gibt nur Spalten mit mehreren Spaltennamen oder Spalten mit mehreren Werten. Das folgende Beispiel zeigt, dass es zwei Wertspalten gibt: Schätzung und MoE

> us_rent_income#tidyr自带的数据集;
# A tibble: 104 × 5
   GEOID NAME       variable estimate   moe
   <chr> <chr>      <chr>       <dbl> <dbl>
 1 01    Alabama    income      24476   136
 2 01    Alabama    rent          747     3
 3 02    Alaska     income      32940   508
 4 02    Alaska     rent         1200    13
 5 04    Arizona    income      27517   148
 6 04    Arizona    rent          972     4
 7 05    Arkansas   income      23789   165
 8 05    Arkansas   rent          709     5
 9 06    California income      29454   109
10 06    California rent         1358     3
# ℹ 94 more rows
# ℹ Use `print(n = ...)` to see more rows
> us_rent_income%>%
+   pivot_wider(names_from=variable, values_from=c(estimate, moe))
# A tibble: 52 × 6
   GEOID NAME             estimate_income estimate_rent moe_income moe_rent
   <chr> <chr>                      <dbl>         <dbl>      <dbl>    <dbl>
 1 01    Alabama                    24476           747        136        3
 2 02    Alaska                     32940          1200        508       13
 3 04    Arizona                    27517           972        148        4
 4 05    Arkansas                   23789           709        165        5
 5 06    California                 29454          1358        109        3
 6 08    Colorado                   32401          1125        109        5
 7 09    Connecticut                35326          1123        195        5
 8 10    Delaware                   31560          1076        247       10
 9 11    District of Col…           43198          1424        681       17
10 12    Florida                    25952          1077         70        3
# ℹ 42 more rows
# ℹ Use `print(n = ...)` to see more rows

Breite und lange Tische:

Bei der Umwandlung einer breiten Tabelle in eine lange Tabelle sollten die umzugestaltenden Spalten in mehrere Spalten „integriert“ werden. Abstrakt bedeutet dies, dass mehrere Spalten in weniger Spalten „integriert“ werden als zuvor, d. h. eine breite Tabelle wird in einen langen Tisch verwandelt werden. Die Integration erfolgt hier in Anführungszeichen, was bedeutet, dass die Informationen der umzugestaltenden Spalten integriert werden. Dieser Integrationsvorgang wird durch die Erstellung neuer Spalten und die Beibehaltung einiger Spalten abgeschlossen. Die kategorialen Variablen, z. B. männlich und weiblich, männlich als Variable , sind in sich geschlossen Eine Spalte, Frauen als Variable bilden eine eigene Spalte, der Prozess der Umwandlung einer breiten Tabelle in eine lange Tabelle besteht darin, Männer und Frauen in Variablen zu klassifizieren und ihnen Geschlecht zu nennen. Beim Erstellen einer neuen Spalte wird es ist erforderlich, um die Spalte zu benennen. Der Name dieser Spalte muss eine Zeichenfolge „Geschlecht“ sein. Der Zellinhalt dieser Geschlechtsspalte wird wiederholt durch „männlich“ und „weiblich“ gewechselt. Der ursprüngliche Name der Datenspalte ist die männliche Spalte und der Zellinhalt darunter ist dasselbe wie die weibliche Spalte. Der Zelleninhalt bildet eine Spalte für sich. Wenn Sie eine neue Spalte für diesen Zellenwert erstellen müssen, verwenden Sie einen Spaltennamen. Der Spaltenname wird normalerweise durch eine Zeichenfolge dargestellt.

Beim Erweitern der langen Tabelle wird der Inhalt unterhalb der Variablen (dh einer Spalte) der langen Tabelle wiederholt. Zu diesem Zeitpunkt sollte der wiederholte Inhalt extrahiert werden, damit diese Werte zu neuen Spaltennamen werden Stellen Sie also „names_from“ ein, also die Spalte der Originaldaten, aus der der neue Spaltenname stammt. Zu diesem Zeitpunkt folgt auf den Parameter der Spaltenname und keine Zeichenfolge. Nachdem wir den neuen Spaltennamen erhalten haben, müssen wir die neue Spalte und den Zellinhalt darunter füllen. Welchen Wert soll dieser füllen? Zum Ausfüllen werden die Werte bestimmter Spalten der ursprünglichen langen Tabelle verwendet (konkrete Analyse spezifischer Probleme). Daher werden die Spaltennamen der Originaldaten nach Werten_von ausgefüllt, ohne Anführungszeichen und nicht als Zeichenfolge.

Beispieldatenquelle:

R-Sprachprogrammierung: Basierend auf der Tidyverse-Asynchronous-Community, die sich der Veröffentlichung und dem Austausch von hochwertigem IT-Wissen verschrieben hat (epubit.com)

Referenz:

„R Language Programming“ (veröffentlicht im Februar 2023, People's Posts and Telecommunications Press)

„R Data Science in der Praxis: Detaillierte Erläuterung von Tools und Fallanalyse“ (veröffentlicht im Juni 2019, Machinery Industry Press)

R-Sprachdatenvisualisierungspraxis (Micro-Video-Volllösungsversion) – professionelles Big-Data-Diagramm vom Einstieg bis zur Beherrschung. (Veröffentlicht im Februar 2022, Electronic Industry Press)

Ich denke du magst

Origin blog.csdn.net/u011375991/article/details/132025047
Empfohlen
Rangfolge