
Add new information to `mass_dataset`
Xiaotao Shen
Created on 2021-12-04 and updated on 2026-03-02
Source:vignettes/add_information.Rmd
add_information.RmdFor one mass_dataset class object, we can add some new
information to mass_dataset class.
Data preparation
library(massdataset)
library(tidyverse)
data("expression_data")
data("sample_info")
data("variable_info")
object =
create_mass_dataset(
expression_data = expression_data,
sample_info = sample_info,
variable_info = variable_info
)
Add new information to
sample_info
Use mutate_xxx() functions
library(tidyverse)
###add NA frequency (%) in sample_info
object2 =
object %>%
mutate_sample_na_freq()
extract_sample_info(object2) %>% head()
#> sample_id injection.order class group na_freq
#> 1 Blank_3 1 Blank Blank 0.682
#> 2 Blank_4 2 Blank Blank 0.702
#> 3 QC_1 3 QC QC 0.397
#> 4 QC_2 4 QC QC 0.381
#> 5 PS4P1 5 Subject Subject 0.424
#> 6 PS4P2 6 Subject Subject 0.427
###add NA number (%) in sample_info
object2 =
object %>%
mutate_sample_na_number()
extract_sample_info(object2) %>% head()
#> sample_id injection.order class group na_number
#> 1 Blank_3 1 Blank Blank 682
#> 2 Blank_4 2 Blank Blank 702
#> 3 QC_1 3 QC QC 397
#> 4 QC_2 4 QC QC 381
#> 5 PS4P1 5 Subject Subject 424
#> 6 PS4P2 6 Subject Subject 427If you want to add NA number/frequency based on specific variables, just provide the variable IDs.
###add NA number (%) in sample_info based on variables with mz > 200
variable_id =
object %>%
activate_mass_dataset(what = "variable_info") %>%
filter(mz > 200) %>%
pull(variable_id)
object2 =
object %>%
mutate_sample_na_number(according_to_variables = variable_id)
extract_sample_info(object2) %>% head()
#> sample_id injection.order class group na_number
#> 1 Blank_3 1 Blank Blank 457
#> 2 Blank_4 2 Blank Blank 474
#> 3 QC_1 3 QC QC 248
#> 4 QC_2 4 QC QC 236
#> 5 PS4P1 5 Subject Subject 240
#> 6 PS4P2 6 Subject Subject 241Use mutate() from tidyverse
mass_dataset support tidyverse functions.
So we can just use the mutate() to add new columns in
sample_info.
###add a new column named as sample_id2 in sample_info
object2 =
object %>%
activate_mass_dataset(what = "sample_info") %>%
mutate(sample_id2 = sample_id)
extract_sample_info(object2) %>% head()
#> sample_id injection.order class group sample_id2
#> 1 Blank_3 1 Blank Blank Blank_3
#> 2 Blank_4 2 Blank Blank Blank_4
#> 3 QC_1 3 QC QC QC_1
#> 4 QC_2 4 QC QC QC_2
#> 5 PS4P1 5 Subject Subject PS4P1
#> 6 PS4P2 6 Subject Subject PS4P2Use left_join() from tidyverse
new_sample_info =
data.frame(sample_id = c("PS4P1", "PS4P2"),
BMI = c(20, 22))
object2 =
object %>%
activate_mass_dataset(what = "sample_info") %>%
left_join(new_sample_info, by = "sample_id")
extract_sample_info(object2) %>% head()
#> sample_id injection.order class group BMI
#> 1 Blank_3 1 Blank Blank NA
#> 2 Blank_4 2 Blank Blank NA
#> 3 QC_1 3 QC QC NA
#> 4 QC_2 4 QC QC NA
#> 5 PS4P1 5 Subject Subject 20
#> 6 PS4P2 6 Subject Subject 22
Add new information to
variable_info
Use mutate_xxx() functions
library(tidyverse)
###add mean intensity in variable_info
object2 =
object %>%
mutate_mean_intensity()
extract_variable_info(object2) %>% head()
#> variable_id mz rt mean_intensity
#> M136T55_2_POS M136T55_2_POS 136.06140 54.97902 1808605.7
#> M79T35_POS M79T35_POS 79.05394 35.36550 2671173.4
#> M307T548_POS M307T548_POS 307.14035 547.56641 276256.3
#> M183T224_POS M183T224_POS 183.06209 224.32777 5103244.9
#> M349T47_POS M349T47_POS 349.01584 47.00262 6789862.4
#> M182T828_POS M182T828_POS 181.99775 828.35712 4326865.8
###add median intensity in variable_info
object2 =
object %>%
mutate_median_intensity()
extract_variable_info(object2) %>% head()
#> variable_id mz rt median_intensity
#> M136T55_2_POS M136T55_2_POS 136.06140 54.97902 1676180.4
#> M79T35_POS M79T35_POS 79.05394 35.36550 2777897.0
#> M307T548_POS M307T548_POS 307.14035 547.56641 273687.8
#> M183T224_POS M183T224_POS 183.06209 224.32777 5103244.9
#> M349T47_POS M349T47_POS 349.01584 47.00262 7169041.1
#> M182T828_POS M182T828_POS 181.99775 828.35712 4433034.2If you want to add mean/median intensity based on specific samples, just provide the sample IDs.
library(tidyverse)
###add mean intensity in variable_info based on QC sample
qc_id =
object %>%
activate_mass_dataset(what = "sample_info") %>%
pull(sample_id)
object2 =
object %>%
mutate_mean_intensity(according_to_samples = qc_id, na.rm = TRUE)
extract_variable_info(object2) %>% head()
#> variable_id mz rt mean_intensity
#> M136T55_2_POS M136T55_2_POS 136.06140 54.97902 1808605.7
#> M79T35_POS M79T35_POS 79.05394 35.36550 2671173.4
#> M307T548_POS M307T548_POS 307.14035 547.56641 276256.3
#> M183T224_POS M183T224_POS 183.06209 224.32777 5103244.9
#> M349T47_POS M349T47_POS 349.01584 47.00262 6789862.4
#> M182T828_POS M182T828_POS 181.99775 828.35712 4326865.8
###add RSD for each variable
object2 =
object %>%
mutate_rsd()
extract_variable_info(object2) %>% head()
#> variable_id mz rt rsd
#> M136T55_2_POS M136T55_2_POS 136.06140 54.97902 50.756560
#> M79T35_POS M79T35_POS 79.05394 35.36550 28.257007
#> M307T548_POS M307T548_POS 307.14035 547.56641 35.041286
#> M183T224_POS M183T224_POS 183.06209 224.32777 1.224228
#> M349T47_POS M349T47_POS 349.01584 47.00262 27.715030
#> M182T828_POS M182T828_POS 181.99775 828.35712 25.534063
###add na
object2 =
object %>%
mutate_sample_na_freq()
extract_variable_info(object2) %>% head()
#> variable_id mz rt
#> 1 M136T55_2_POS 136.06140 54.97902
#> 2 M79T35_POS 79.05394 35.36550
#> 3 M307T548_POS 307.14035 547.56641
#> 4 M183T224_POS 183.06209 224.32777
#> 5 M349T47_POS 349.01584 47.00262
#> 6 M182T828_POS 181.99775 828.35712
###add na
object2 =
object %>%
mutate_sample_na_number()
extract_variable_info(object2) %>% head()
#> variable_id mz rt
#> 1 M136T55_2_POS 136.06140 54.97902
#> 2 M79T35_POS 79.05394 35.36550
#> 3 M307T548_POS 307.14035 547.56641
#> 4 M183T224_POS 183.06209 224.32777
#> 5 M349T47_POS 349.01584 47.00262
#> 6 M182T828_POS 181.99775 828.35712Use mutate() from tidyverse
###add a new column named as variable_id2 in variable_info
object2 =
object %>%
activate_mass_dataset(what = "variable_info") %>%
mutate(variable_id2 = variable_id)
extract_sample_info(object2) %>% head()
#> sample_id injection.order class group
#> 1 Blank_3 1 Blank Blank
#> 2 Blank_4 2 Blank Blank
#> 3 QC_1 3 QC QC
#> 4 QC_2 4 QC QC
#> 5 PS4P1 5 Subject Subject
#> 6 PS4P2 6 Subject SubjectUse left_join() from tidyverse
new_variable_info =
data.frame(variable_id = c("M136T55_2_POS", "M79T35_POS"),
marker = c("yes", "no"))
object2 =
object %>%
activate_mass_dataset(what = "variable_info") %>%
left_join(new_variable_info, by = "variable_id")
extract_variable_info(object2) %>% head()
#> variable_id mz rt marker
#> 1 M136T55_2_POS 136.06140 54.97902 yes
#> 2 M79T35_POS 79.05394 35.36550 no
#> 3 M307T548_POS 307.14035 547.56641 <NA>
#> 4 M183T224_POS 183.06209 224.32777 <NA>
#> 5 M349T47_POS 349.01584 47.00262 <NA>
#> 6 M182T828_POS 181.99775 828.35712 <NA>
Add new samples to
expression_data
Just use the mutate() to add new samples to
expression_data.
```{r,eval=TRUE,warning=FALSE, R.options=““, message=FALSE, cache=FALSE, fig.alt=”Scatter plot comparing the copied QC_2 and QC_3 sample intensities after adding new samples.”} colnames(object) object2 = object %>% activate_mass_dataset(what = “expression_data”) %>% mutate(QC_3 = QC_2, QC_4 = 1:1000)
colnames(object2)
plot(object2QC_3)
``` r
extract_sample_info(object2)
#> sample_id injection.order class group
#> 1 Blank_3 1 Blank Blank
#> 2 Blank_4 2 Blank Blank
#> 3 QC_1 3 QC QC
#> 4 QC_2 4 QC QC
#> 5 PS4P1 5 Subject Subject
#> 6 PS4P2 6 Subject Subject
#> 7 PS4P3 7 Subject Subject
#> 8 PS4P4 8 Subject Subject
Session information
sessionInfo()
#> R version 4.5.2 (2025-10-31)
#> Platform: aarch64-apple-darwin20
#> Running under: macOS Tahoe 26.3
#>
#> Matrix products: default
#> BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
#> LAPACK: /Library/Frameworks/R.framework/Versions/4.5-arm64/Resources/lib/libRlapack.dylib; LAPACK version 3.12.1
#>
#> locale:
#> [1] C.UTF-8/C.UTF-8/C.UTF-8/C/C.UTF-8/C.UTF-8
#>
#> time zone: Asia/Singapore
#> tzcode source: internal
#>
#> attached base packages:
#> [1] stats graphics grDevices utils datasets methods base
#>
#> other attached packages:
#> [1] lubridate_1.9.4 forcats_1.0.0 stringr_1.5.1 purrr_1.1.0
#> [5] readr_2.1.5 tidyr_1.3.1 tibble_3.3.0 tidyverse_2.0.0
#> [9] magrittr_2.0.3 dplyr_1.1.4 ggplot2_4.0.2 massdataset_0.99.1
#>
#> loaded via a namespace (and not attached):
#> [1] tidyselect_1.2.1 farver_2.1.2
#> [3] S7_0.2.0 fastmap_1.2.0
#> [5] digest_0.6.37 timechange_0.3.0
#> [7] lifecycle_1.0.4 cluster_2.1.8.1
#> [9] compiler_4.5.2 rlang_1.1.6
#> [11] sass_0.4.10 tools_4.5.2
#> [13] yaml_2.3.10 knitr_1.50
#> [15] S4Arrays_1.8.1 htmlwidgets_1.6.4
#> [17] DelayedArray_0.34.1 RColorBrewer_1.1-3
#> [19] abind_1.4-8 withr_3.0.2
#> [21] BiocGenerics_0.54.0 desc_1.4.3
#> [23] grid_4.5.2 stats4_4.5.2
#> [25] colorspace_2.1-1 scales_1.4.0
#> [27] iterators_1.0.14 dichromat_2.0-0.1
#> [29] SummarizedExperiment_1.38.1 cli_3.6.5
#> [31] rmarkdown_2.29 crayon_1.5.3
#> [33] ragg_1.4.0 generics_0.1.4
#> [35] rstudioapi_0.17.1 httr_1.4.7
#> [37] tzdb_0.5.0 rjson_0.2.23
#> [39] cachem_1.1.0 parallel_4.5.2
#> [41] XVector_0.48.0 matrixStats_1.5.0
#> [43] vctrs_0.6.5 Matrix_1.7-4
#> [45] jsonlite_2.0.0 IRanges_2.42.0
#> [47] hms_1.1.3 GetoptLong_1.0.5
#> [49] S4Vectors_0.48.0 clue_0.3-66
#> [51] systemfonts_1.2.3 foreach_1.5.2
#> [53] jquerylib_0.1.4 glue_1.8.0
#> [55] pkgdown_2.1.3 codetools_0.2-20
#> [57] stringi_1.8.7 shape_1.4.6.1
#> [59] gtable_0.3.6 GenomeInfoDb_1.44.2
#> [61] GenomicRanges_1.60.0 UCSC.utils_1.4.0
#> [63] ComplexHeatmap_2.24.1 pillar_1.11.0
#> [65] htmltools_0.5.8.1 GenomeInfoDbData_1.2.14
#> [67] circlize_0.4.16 R6_2.6.1
#> [69] textshaping_1.0.1 doParallel_1.0.17
#> [71] evaluate_1.0.4 Biobase_2.68.0
#> [73] lattice_0.22-7 png_0.1-8
#> [75] openxlsx_4.2.8 bslib_0.9.0
#> [77] Rcpp_1.1.0 zip_2.3.3
#> [79] SparseArray_1.8.1 xfun_0.53
#> [81] fs_1.6.6 MatrixGenerics_1.20.0
#> [83] pkgconfig_2.0.3 GlobalOptions_0.1.2