library(tidyverse)
purrr-map06
Exercise
Erstellen Sie eine Tabelle mit mit folgenden Spalten:
- ID-Spalte: \(1,2,..., 10\)
- Eine Spalte mit Namen
ds
(ds
wie Plural von Datensatz), die als geschachtelt (nested) pro Element jeweils einen der folgenden Datensätze enthält:mtcars
,iris
,chickweight
,ToothGrowth
(alle in R enthalten)
Berechnen Sie eine Spalte, die die Anzahl der Spalten von ds
zählt!
Solution
Hier sind einige Datensätze, in einer Liste zusammengefasst:
<- list(mtcars = mtcars, iris = iris, chickweight = ChickWeight, toothgrowth = ToothGrowth) ds
Daraus erstellen wir eine Tabelle mit Listenspalte für die Daten:
<-
d tibble(id = 1:length(ds),
ds = ds)
Jetzt führen wir die Funktion ncol
aus, und zwar für jedes Element von ds
. Wir brauchen also eine Art Schleife, das besorgt map
für uns. Viele Funktionen in R sind “auomatisch verschleift” - das nennt man vektorisiert. Vektorisierte Funktionen werden für jedes Element eines Vektors ausgeführt.
Ein Beispiel für eine vektorisierte Funktion ist die Funktion +
:
<- c(1,2,3)
x <- c(10, 20, 30)
y + y x
[1] 11 22 33
Man könnte übrigens auch schreiben:
`+`(x, y)
[1] 11 22 33
Was zeigt, dass +
eine normale Funktion ist.
Zurück zur eigentlichen Aufgabe. Aber ncol
ist eben nicht vektorisiert, darum müssen wir da noch eine Schleife dazu bauen, das macht map
.
<-
d2 %>%
d mutate(n_col = map(ds, ncol))
head(d2)
# A tibble: 4 × 3
id ds n_col
<int> <named list> <named list>
1 1 <df [32 × 11]> <int [1]>
2 2 <df [150 × 5]> <int [1]>
3 3 <nfnGrpdD [578 × 4]> <int [1]>
4 4 <df [60 × 3]> <int [1]>
Entnesten wir noch n_col
:
%>%
d2 unnest(n_col)
# A tibble: 4 × 3
id ds n_col
<int> <named list> <int>
1 1 <df [32 × 11]> 11
2 2 <df [150 × 5]> 5
3 3 <nfnGrpdD [578 × 4]> 4
4 4 <df [60 × 3]> 3
Wir können auch gleich map
anweisen, keine Liste, sondern eine Zahl (double
, reelle ) Zahl zurückzuliefern, dann sparen wir uns das entschachteln:
%>%
d mutate(n_col = map_dbl(ds, ncol))
# A tibble: 4 × 3
id ds n_col
<int> <named list> <dbl>
1 1 <df [32 × 11]> 11
2 2 <df [150 × 5]> 5
3 3 <nfnGrpdD [578 × 4]> 4
4 4 <df [60 × 3]> 3
Categories:
- programming
- loop