Chapter 10 Subsetting
Nötig, wenn Teildatensätze gebraucht werden.
10.1 Base R
10.1.1 Subsets mit Slicing-Techniken
require(tidyverse)
dd <- readr::read_tsv("https://md.psych.bio.uni-goettingen.de/mv/data/div/df_dplyr.txt")## Rows: 12 Columns: 7
## ── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────
## Delimiter: "\t"
## chr (1): gender
## dbl (6): subj, age, grp, v1, v2, v3
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# to get dataframe of women only
dd[dd$gender == "f",]## # A tibble: 6 × 7
## subj gender age grp v1 v2 v3
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 f 17 1 9 16 8
## 2 2 f 33 2 67 73 66
## 3 3 f 47 3 86 87 91
## 4 4 f 10 1 64 68 67
## 5 5 f 21 2 40 46 44
## 6 6 f 30 3 26 34 28
# to get sociodemografic data of grp 2 only
dd[dd$grp == 2, c("subj", "gender", "age", "grp")]## # A tibble: 4 × 4
## subj gender age grp
## <dbl> <chr> <dbl> <dbl>
## 1 2 f 33 2
## 2 5 f 21 2
## 3 8 m 13 2
## 4 11 m 33 2
10.1.2 Subsets mit Base R split() oder subset()
dd <- readr::read_tsv("https://md.psych.bio.uni-goettingen.de/mv/data/div/df_dplyr.txt")## Rows: 12 Columns: 7
## ── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────
## Delimiter: "\t"
## chr (1): gender
## dbl (6): subj, age, grp, v1, v2, v3
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
split(dd, dd$grp)## $`1`
## # A tibble: 4 × 7
## subj gender age grp v1 v2 v3
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 f 17 1 9 16 8
## 2 4 f 10 1 64 68 67
## 3 7 m 51 1 64 66 64
## 4 10 m 25 1 38 36 35
##
## $`2`
## # A tibble: 4 × 7
## subj gender age grp v1 v2 v3
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2 f 33 2 67 73 66
## 2 5 f 21 2 40 46 44
## 3 8 m 13 2 61 66 64
## 4 11 m 33 2 22 25 21
##
## $`3`
## # A tibble: 4 × 7
## subj gender age grp v1 v2 v3
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 3 f 47 3 86 87 91
## 2 6 f 30 3 26 34 28
## 3 9 m 17 3 67 67 67
## 4 12 m 27 3 81 86 81
# when we store it, we can access parts of it, its a list
dd.s <- split(dd, dd$grp)
dd.s[2]## $`2`
## # A tibble: 4 × 7
## subj gender age grp v1 v2 v3
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2 f 33 2 67 73 66
## 2 5 f 21 2 40 46 44
## 3 8 m 13 2 61 66 64
## 4 11 m 33 2 22 25 21
# using subset function
subset(dd, age >= 33 | age < 20, select=c(subj, age, grp))## # A tibble: 8 × 3
## subj age grp
## <dbl> <dbl> <dbl>
## 1 1 17 1
## 2 2 33 2
## 3 3 47 3
## 4 4 10 1
## 5 7 51 1
## 6 8 13 2
## 7 9 17 3
## 8 11 33 2
subset(dd, gender=="m" & age > 30, select=subj:grp)## # A tibble: 2 × 4
## subj gender age grp
## <dbl> <chr> <dbl> <dbl>
## 1 7 m 51 1
## 2 11 m 33 2
10.2 Tidyverse: dplyr::filter()
Mit dplyr::filter() lassen sich sehr spezifische Teildatensätze generieren, insbesondere in Kombinationn mit dplyr::select()
groupwise stellt eine andere Möglichkeit dar:
Mit dplyr::group_by() wird eine Datentabelle (tibble) aufgeteilt in Subgruppen von Beobachtungen.
Alle Berechnungen danach werden für jede Subgruppe separat durchgeführt.
require(tidyverse)
dd <- readr::read_tsv("https://md.psych.bio.uni-goettingen.de/mv/data/div/df_dplyr.txt")## Rows: 12 Columns: 7
## ── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────
## Delimiter: "\t"
## chr (1): gender
## dbl (6): subj, age, grp, v1, v2, v3
##
## ℹ Use `spec()` to retrieve the full column specification for this data.
## ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
# to get dataframe of women only
dd %>% dplyr::filter(gender == "f")## # A tibble: 6 × 7
## subj gender age grp v1 v2 v3
## <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 f 17 1 9 16 8
## 2 2 f 33 2 67 73 66
## 3 3 f 47 3 86 87 91
## 4 4 f 10 1 64 68 67
## 5 5 f 21 2 40 46 44
## 6 6 f 30 3 26 34 28
# to get sociodemografic data of grp 2 only
dd %>% dplyr::filter(grp == 2) %>% dplyr::select(subj:grp)## # A tibble: 4 × 4
## subj gender age grp
## <dbl> <chr> <dbl> <dbl>
## 1 2 f 33 2
## 2 5 f 21 2
## 3 8 m 13 2
## 4 11 m 33 2
10.3 Referenzen
- Data Wrangling Cheatsheet
- Beispiele und Erklärungen: Unit transformation base
- Beispiele und Erklärungen: Unit transformation dplyr