Skip to contents

For 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       427

If 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       241

Use 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      PS4P2

Use 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.2

If 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.35712

Use 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 Subject

Use 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(object2QC2,object2QC_2, 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