Chapter 10 Subsetting
Nötig, wenn Teildatensätze gebraucht werden.
10.1 Base R
10.1.1 Subsets mit Slicing-Techniken
require(tidyverse)
<- readr::read_tsv("https://md.psych.bio.uni-goettingen.de/mv/data/div/df_dplyr.txt") dd
## 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
$gender == "f",] dd[dd
## # 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
$grp == 2, c("subj", "gender", "age", "grp")] dd[dd
## # 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()
<- readr::read_tsv("https://md.psych.bio.uni-goettingen.de/mv/data/div/df_dplyr.txt") dd
## 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
<- split(dd, dd$grp)
dd.s 2] dd.s[
## $`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)
<- readr::read_tsv("https://md.psych.bio.uni-goettingen.de/mv/data/div/df_dplyr.txt") dd
## 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
%>% dplyr::filter(gender == "f") dd
## # 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
%>% dplyr::filter(grp == 2) %>% dplyr::select(subj:grp) dd
## # 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