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