purrr-map05

programming
loop
Published

October 24, 2022

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.1.3     ✔ readr     2.1.4
✔ forcats   1.0.0     ✔ stringr   1.5.0
✔ ggplot2   3.4.4     ✔ tibble    3.2.1
✔ lubridate 1.9.3     ✔ tidyr     1.3.0
✔ purrr     1.0.2     
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag()    masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors

Exercise

Erstellen Sie eine Tabelle mit mit folgenden Spalten:

  • ID-Spalte: \(1,2,..., 10\)
  • Eine Spalte, in der jede Zelle eine Tabelle mit einem Vektor \(x\), einer standardnormalverteilten Zufallszahlen (n=1000), enthält

Berechnen Sie den Mittelwert von jedem \(x\)! Diese Ergebnisse sollen als weitere Spalte der Tabelle hinzugefügt werden.











Solution

d <- tibble(
  id = 1:10) %>% 
  mutate(x = map(id, ~ rnorm(n = 1e3))
) 

str(d)
tibble [10 × 2] (S3: tbl_df/tbl/data.frame)
 $ id: int [1:10] 1 2 3 4 5 6 7 8 9 10
 $ x :List of 10
  ..$ : num [1:1000] -0.114 0.607 1.288 0.372 -0.438 ...
  ..$ : num [1:1000] 0.982 -0.376 0.421 -0.59 1.143 ...
  ..$ : num [1:1000] 0.429 0.417 0.592 -1.735 -1.192 ...
  ..$ : num [1:1000] 0.514 -0.244 1.358 0.432 1.227 ...
  ..$ : num [1:1000] 0.47 -0.621 -0.15 -0.959 2.287 ...
  ..$ : num [1:1000] 0.0743 0.1768 -0.8956 -0.029 1.1695 ...
  ..$ : num [1:1000] 1.672 -0.976 1.019 -0.327 -0.165 ...
  ..$ : num [1:1000] -0.0175 2.7151 -0.464 -0.4519 0.4463 ...
  ..$ : num [1:1000] -0.18 0.729 -0.494 0.127 -0.391 ...
  ..$ : num [1:1000] -1.058 0.898 1.085 0.142 3.171 ...

So kann man sich die Mittelwerte ausgeben lassen:

d$x %>% 
  map(mean)
[[1]]
[1] 0.01370096

[[2]]
[1] 0.005118962

[[3]]
[1] -0.001769942

[[4]]
[1] -0.01192552

[[5]]
[1] 0.01277106

[[6]]
[1] -0.04090293

[[7]]
[1] 0.05199444

[[8]]
[1] 0.01361518

[[9]]
[1] 0.001292623

[[10]]
[1] -0.005675222

Jetzt fügen wir den letzten Schritt als Spalte hinzu:

d2 <-
  d %>% 
  mutate(x_mean = map_dbl(x, ~ mean(.x))) 

head(d2)
# A tibble: 6 × 3
     id x               x_mean
  <int> <list>           <dbl>
1     1 <dbl [1,000]>  0.0137 
2     2 <dbl [1,000]>  0.00512
3     3 <dbl [1,000]> -0.00177
4     4 <dbl [1,000]> -0.0119 
5     5 <dbl [1,000]>  0.0128 
6     6 <dbl [1,000]> -0.0409 

Hier hätten wir auch schreiben können:

d %>% 
  mutate(x_mean = map(x, mean)) %>% 
  unnest(x_mean) %>% 
  head()
# A tibble: 6 × 3
     id x               x_mean
  <int> <list>           <dbl>
1     1 <dbl [1,000]>  0.0137 
2     2 <dbl [1,000]>  0.00512
3     3 <dbl [1,000]> -0.00177
4     4 <dbl [1,000]> -0.0119 
5     5 <dbl [1,000]>  0.0128 
6     6 <dbl [1,000]> -0.0409 

Categories:

  • programming
  • loop