From 9441e0df742e38dec45a2d2d4d1746efedc50d01 Mon Sep 17 00:00:00 2001 From: GitHub Actions Date: Tue, 30 Jul 2024 20:29:23 +0000 Subject: [PATCH] Built site for sdtm.oak: 0.0.0.9005@ac83562 --- articles/algorithms.html | 2 +- articles/articles/algorithms.html | 8 -- articles/articles/cnd_df.html | 8 -- articles/articles/events_domain.html | 8 -- articles/articles/findings_domain.html | 8 -- articles/articles/iso_8601.html | 8 -- articles/articles/study_sdtm_spec.html | 8 -- articles/cnd_df.html | 2 +- articles/events_domain.html | 54 ++++++------- articles/findings_domain.html | 30 ++++---- articles/iso_8601.html | 2 +- articles/study_sdtm_spec.html | 2 +- .../fonts/1Ptug8zYS_SKggPNyC0ITw.woff2 | Bin 48208 -> 48336 bytes .../fonts/1Ptug8zYS_SKggPNyCAIT5lu.woff2 | Bin 26788 -> 26988 bytes .../fonts/1Ptug8zYS_SKggPNyCIIT5lu.woff2 | Bin 11176 -> 11384 bytes .../fonts/1Ptug8zYS_SKggPNyCMIT5lu.woff2 | Bin 30744 -> 30860 bytes .../fonts/1Ptug8zYS_SKggPNyCkIT5lu.woff2 | Bin 25828 -> 25796 bytes pkgdown.yml | 2 +- reference/domain_example.html | 71 ++---------------- reference/index.html | 5 ++ reference/read_ct_spec.html | 2 +- search.json | 2 +- 22 files changed, 59 insertions(+), 163 deletions(-) delete mode 100644 articles/articles/algorithms.html delete mode 100644 articles/articles/cnd_df.html delete mode 100644 articles/articles/events_domain.html delete mode 100644 articles/articles/findings_domain.html delete mode 100644 articles/articles/iso_8601.html delete mode 100644 articles/articles/study_sdtm_spec.html diff --git a/articles/algorithms.html b/articles/algorithms.html index 5b81448a..efb7169e 100644 --- a/articles/algorithms.html +++ b/articles/algorithms.html @@ -86,7 +86,7 @@

Algorithms & Sub-Algorithms

- Source: vignettes/articles/algorithms.Rmd + Source: vignettes/algorithms.Rmd
algorithms.Rmd
diff --git a/articles/articles/algorithms.html b/articles/articles/algorithms.html deleted file mode 100644 index 94e7ff1f..00000000 --- a/articles/articles/algorithms.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/articles/articles/cnd_df.html b/articles/articles/cnd_df.html deleted file mode 100644 index 36b52921..00000000 --- a/articles/articles/cnd_df.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/articles/articles/events_domain.html b/articles/articles/events_domain.html deleted file mode 100644 index 0b26edfc..00000000 --- a/articles/articles/events_domain.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/articles/articles/findings_domain.html b/articles/articles/findings_domain.html deleted file mode 100644 index fdeb6bb3..00000000 --- a/articles/articles/findings_domain.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/articles/articles/iso_8601.html b/articles/articles/iso_8601.html deleted file mode 100644 index f910b989..00000000 --- a/articles/articles/iso_8601.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/articles/articles/study_sdtm_spec.html b/articles/articles/study_sdtm_spec.html deleted file mode 100644 index 5707e14b..00000000 --- a/articles/articles/study_sdtm_spec.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/articles/cnd_df.html b/articles/cnd_df.html index d5d2dd7c..a9e6fa4e 100644 --- a/articles/cnd_df.html +++ b/articles/cnd_df.html @@ -86,7 +86,7 @@

Conditioned Data Frames

- Source: vignettes/articles/cnd_df.Rmd + Source: vignettes/cnd_df.Rmd
cnd_df.Rmd
diff --git a/articles/events_domain.html b/articles/events_domain.html index e4a2111f..6423c9ea 100644 --- a/articles/events_domain.html +++ b/articles/events_domain.html @@ -96,7 +96,7 @@

Creating an Events SDTM domain

- Source: vignettes/articles/events_domain.Rmd + Source: vignettes/events_domain.Rmd
events_domain.Rmd
@@ -120,8 +120,8 @@

Raw data

The raw dataset is presented below:

-
- +
+
-
-

Read in the DM domain

+
+

Read in the DM domain

 dm <- read.csv(system.file("raw_data/dm.csv",
   package = "sdtm.oak"
@@ -208,8 +208,8 @@ 

Read in CT< study_ct <- read.csv(system.file("raw_data/sdtm_ct.csv", package = "sdtm.oak" ))

-
- +
+

Map Topic Variable @@ -232,8 +232,8 @@

Map Topic Variable= "MDRAW", tgt_var = "CMTRT" )

-
- +
+
-
-

The CMGRPID is added to the corresponding CMTRT based on the +

+

The CMGRPID is added to the corresponding CMTRT based on the ‘oak_id_vars’. When calling the function, the parameter ‘id_vars = oak_id_vars()’ matches the raw dataset ‘oak_id_vars’ to the ‘oak_id_vars’ in the cm domain created in the previous step. It’s @@ -283,8 +283,8 @@

assign_ct= "C71620", id_vars = oak_id_vars() ) -
- +
+

assign_datetime @@ -305,8 +305,8 @@

assign_datetime raw_unk = c("UN", "UNK"), id_vars = oak_id_vars() )

-
- +
+

hardcode_ct and condition_add @@ -336,8 +336,8 @@

hardcode_ct and condition_add= "C66728", id_vars = oak_id_vars() )

-
-

The condition_add function adds additional metadata to +

+

The condition_add function adds additional metadata to the records in the raw dataset that meets the condition. Refer to the function documentation for more details. hardcode_ct function uses the additional metadata to find the records that meet the @@ -363,8 +363,8 @@

hardcode_no_ct and condition_add tgt_val = "SCREENING", id_vars = oak_id_vars() ) -
- +
+

condition_add involving target domain @@ -397,8 +397,8 @@

condition_add involving target domain= oak_id_vars() ) }

-
-

Remember to use additional curly braces in the function call when +

+

Remember to use additional curly braces in the function call when using the condition_add function on the target dataset. This is necessary because the input target dataset is represented as a . and is passed on from the previous step using the @@ -452,8 +452,8 @@

condition_add involving raw dataset and target do id_vars = oak_id_vars() ) } -
-

Another way to achieve the same outcome is by moving the +

+

Another way to achieve the same outcome is by moving the ‘condition_by’ call up one level, as illustrated below: it is not required to use the {magrittr} pipe %>% or curly braces in this case.

@@ -582,8 +582,8 @@

condition_add involving raw dataset and target do tgt_var = "CMPNCD", id_vars = oak_id_vars() ) -
- +
+
@@ -631,8 +631,8 @@

Create SDTM derived variables) %>% # Add code for derive Baseline flag. dplyr::select("STUDYID", "DOMAIN", "USUBJID", everything())

-
- +
+

Add Labels and Attributes diff --git a/articles/findings_domain.html b/articles/findings_domain.html index 2b391c3f..3322e6af 100644 --- a/articles/findings_domain.html +++ b/articles/findings_domain.html @@ -96,7 +96,7 @@

Creating an Findings SDTM domain

- Source: vignettes/articles/findings_domain.Rmd + Source: vignettes/findings_domain.Rmd
findings_domain.Rmd
@@ -149,8 +149,8 @@

Read in datavs_raw <- read.csv(system.file("raw_data/vitals_raw_data.csv", package = "sdtm.oak" )) -
- +
+

Create oak_id_vars @@ -161,8 +161,8 @@

Create oak_id_vars pat_var = "PATNUM", raw_src = "vitals" )

-
-

Read in the DM domain

+
+

Read in the DM domain

Read in CT @@ -175,8 +175,8 @@

Read in CT< study_ct <- read.csv(system.file("raw_data/sdtm_ct.csv", package = "sdtm.oak" ))

-
- +
+

Map Topic Variable @@ -198,8 +198,8 @@

Map Topic Variable# Filter for records where VSTESTCD is not empty. # Only these records need qualifier mappings. dplyr::filter(!is.na(.data$VSTESTCD))

-
- +
+

Map Rest of the Variables @@ -245,8 +245,8 @@

Map Rest of the Variables ct_clst = "C71148", id_vars = oak_id_vars() )

-
- +
+

Repeat Map Topic and Map Rest @@ -561,8 +561,8 @@

Repeat Map Topic and Map Rest= "VISITNUM", id_vars = oak_id_vars() )

-
- +
+

Create SDTM derived variables @@ -586,8 +586,8 @@

Create SDTM derived variables= "VSDY" ) %>% dplyr::select("STUDYID", "DOMAIN", "USUBJID", everything())

-
- +
+

Add Labels and Attributes diff --git a/articles/iso_8601.html b/articles/iso_8601.html index 0d2672cb..d32563d9 100644 --- a/articles/iso_8601.html +++ b/articles/iso_8601.html @@ -86,7 +86,7 @@

Converting dates, times or date-times to ISO 8601

- Source: vignettes/articles/iso_8601.Rmd + Source: vignettes/iso_8601.Rmd
iso_8601.Rmd
diff --git a/articles/study_sdtm_spec.html b/articles/study_sdtm_spec.html index 33a60303..ac5a139e 100644 --- a/articles/study_sdtm_spec.html +++ b/articles/study_sdtm_spec.html @@ -86,7 +86,7 @@

All about Metadata

- Source: vignettes/articles/study_sdtm_spec.Rmd + Source: vignettes/study_sdtm_spec.Rmd
study_sdtm_spec.Rmd
diff --git a/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyC0ITw.woff2 b/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyC0ITw.woff2 index f4675de1a37555a06874a62a8990162272e62520..6478b9adc5d0f1fb11aceaf77caf7c9ee4d02931 100644 GIT binary patch literal 48336 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 Y!42e+-w1Py)l#D=AO`@o!Ap7*0K1pAlmGw# diff --git a/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCAIT5lu.woff2 b/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCAIT5lu.woff2 index 7ac6ae08f5c12d2a56d8069987645912c717d297..dee82d4ba4c754ec82a4970543a8c9782be02fe8 100644 GIT binary patch literal 26988 zcmV({K+?Z=Pew8T0RR910BLLh761SM0M}>$0BG|70RR9100000000000000000000 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�xq)?^e>1|A} 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 Po24Ec0N}1zr)~oP3#wmW literal 26788 zcmV)5K*_&%Pew8T0RR910BEED761SM0M*a{0B9@#0RR9100000000000000000000 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ƕk-G3wQz# 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�(`Q;v`uDhG$X=qvEhgbLsS5JC5_amNJ$C>5#*#K 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 diff --git a/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCkIT5lu.woff2 b/deps/bootstrap-5.3.1/fonts/1Ptug8zYS_SKggPNyCkIT5lu.woff2 index 49dbbaa57871dffa75b8b94c6fa2984a10ef4b86..1005b7c8fe59544000803ee1b19d6cf20dc70d33 100644 GIT binary patch literal 25796 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 diff --git a/pkgdown.yml b/pkgdown.yml index b5c5717c..c12ae078 100644 --- a/pkgdown.yml +++ b/pkgdown.yml @@ -8,7 +8,7 @@ articles: findings_domain: findings_domain.html iso_8601: iso_8601.html study_sdtm_spec: study_sdtm_spec.html -last_built: 2024-07-29T14:50Z +last_built: 2024-07-30T20:28Z urls: reference: https://pharmaverse.github.io/sdtm.oak/reference article: https://pharmaverse.github.io/sdtm.oak/articles diff --git a/reference/domain_example.html b/reference/domain_example.html index 0621a7c9..69744ce4 100644 --- a/reference/domain_example.html +++ b/reference/domain_example.html @@ -104,72 +104,11 @@

Details{pharmaversesdtm}.

Example SDTM domains

- -
"ae_ophtha"
-

Ophthalmology Adverse Events Dataset.

- -
"ae"
-

Adverse Events Dataset-updated.

- -
"ce_vaccine"
-

Clinical Events Dataset for Vaccine Studies.

- -
"cm"
-

Concomitant Medication Dataset.

- -
"dm_vaccine"
-

Demographics Dataset for Vaccine Studies.

- -
"dm"
-

Demography Dataset.

- -
"ds"
-

Disposition Dataset-updated.

- -
"eg"
-

Electrocardiogram Dataset.

- -
"ex_ophtha"
-

Ophthalmology Exposure Dataset.

- -
"ex_vaccine"
-

Exposures Dataset for Vaccine Studies.

- -
"ex"
-

Exposure Dataset.

- -
"face_vaccine"
-

Findings About Clinical Events Dataset for Vaccine Studies.

- -
"is_vaccine"
-

Immunogenicity Specimen Assessments Dataset for Vaccine Studies.

- -
"lb"
-

Laboratory Measurements Dataset.

- -
"mh"
-

Medical History Dataset-updated.

- -
"oe_ophtha"
-

Ophthalmology Adverse Events Dataset.

- -
"pc"
-

Pharmacokinetics Concentrations Dataset.

- -
"pp"
-

Pharmacokinetics Parameters Dataset.

- -
"qs_ophtha"
-

Ophthalmology Questionnaire Dataset.

- -
"rs_onco_irecist"
-

Disease Response Dataset (iRECIST).

- -
"rs_onco"
-

Disease Response Dataset.

- - -
+
  • "ae": Adverse Events (AE) data set.

  • +
  • "apsc": Associated Persons Subject Characteristics (APSC) data set.

  • +
  • "cm": Concomitant Medications (CM) data set.

  • +
  • "vs": Vital Signs (VS) data set.

  • +
diff --git a/reference/index.html b/reference/index.html index 0271b09b..6e30d84b 100644 --- a/reference/index.html +++ b/reference/index.html @@ -136,6 +136,11 @@

Conditioned data framestbl_sum(<cnd_df>)
Conditioned tibble header print method
+
+ + mutate(<cnd_df>) +
+
Mutate method for conditioned data frames

SDTM examples

diff --git a/reference/read_ct_spec.html b/reference/read_ct_spec.html index ad585ca3..c040504d 100644 --- a/reference/read_ct_spec.html +++ b/reference/read_ct_spec.html @@ -65,7 +65,7 @@

Usage

-
read_ct_spec(file = stop("`file` must be specified"))
+
read_ct_spec(file = cli::cli_abort("`file` must be specified"))
diff --git a/search.json b/search.json index 6c169cb9..300082df 100644 --- a/search.json +++ b/search.json @@ -1 +1 @@ -[{"path":"https://pharmaverse.github.io/sdtm.oak/CODE_OF_CONDUCT.html","id":null,"dir":"","previous_headings":"","what":"Contributor Code of Conduct","title":"Contributor Code of Conduct","text":"contributors maintainers project, pledge respect people contribute reporting issues, posting feature requests, updating documentation, submitting pull requests patches, activities. committed making participation project harassment-free experience everyone, regardless level experience, gender, gender identity expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion. Examples unacceptable behavior participants include use sexual language imagery, derogatory comments personal attacks, trolling, public private harassment, insults, unprofessional conduct. Project maintainers right responsibility remove, edit, reject comments, commits, code, wiki edits, issues, contributions aligned Code Conduct. Project maintainers follow Code Conduct may removed project team. Instances abusive, harassing, otherwise unacceptable behavior may reported opening issue contacting one project maintainers. Code Conduct adapted Contributor Covenant (http://contributor-covenant.org), version 1.0.0, available http://contributor-covenant.org/version/1/0/0/","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/CONTRIBUTING.html","id":null,"dir":"","previous_headings":"","what":"Contribution to {sdtm.oak}","title":"Contribution to {sdtm.oak}","text":"outlines propose change sdtm.oak package. detailed info contributing {sdtm.oak}, pharmaverse packages, please see Contribution Guide well Developer Guides Articles section {admiraldev} website. Please note try align best practices used R packages’ development processes - veteran developers familiar processes. However, deviate slightly best practices advise new contributors review package documentation accordingly.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/CONTRIBUTING.html","id":"basics","dir":"","previous_headings":"","what":"Basics","title":"Contribution to {sdtm.oak}","text":"new contribution, user creates issue issue tab GitHub put backlog. issues can range bug identification /fixes, enhancements functions, documentation, tests new features. advise contact us issue created via Slack (don’t access, use link join). can discuss details align expectations familiar sdtm.oak philosophy programming strategy. team try review issues within next backlog meeting give initial feedback. Since 100% fully resourced software development team might issues take longer respond depending amount overall issues.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":null,"dir":"","previous_headings":"","what":"Apache License","title":"Apache License","text":"Version 2.0, January 2004 ","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_1-definitions","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"1. Definitions","title":"Apache License","text":"“License” shall mean terms conditions use, reproduction, distribution defined Sections 1 9 document. “Licensor” shall mean copyright owner entity authorized copyright owner granting License. “Legal Entity” shall mean union acting entity entities control, controlled , common control entity. purposes definition, “control” means () power, direct indirect, cause direction management entity, whether contract otherwise, (ii) ownership fifty percent (50%) outstanding shares, (iii) beneficial ownership entity. “” (“”) shall mean individual Legal Entity exercising permissions granted License. “Source” form shall mean preferred form making modifications, including limited software source code, documentation source, configuration files. “Object” form shall mean form resulting mechanical transformation translation Source form, including limited compiled object code, generated documentation, conversions media types. “Work” shall mean work authorship, whether Source Object form, made available License, indicated copyright notice included attached work (example provided Appendix ). “Derivative Works” shall mean work, whether Source Object form, based (derived ) Work editorial revisions, annotations, elaborations, modifications represent, whole, original work authorship. purposes License, Derivative Works shall include works remain separable , merely link (bind name) interfaces , Work Derivative Works thereof. “Contribution” shall mean work authorship, including original version Work modifications additions Work Derivative Works thereof, intentionally submitted Licensor inclusion Work copyright owner individual Legal Entity authorized submit behalf copyright owner. purposes definition, “submitted” means form electronic, verbal, written communication sent Licensor representatives, including limited communication electronic mailing lists, source code control systems, issue tracking systems managed , behalf , Licensor purpose discussing improving Work, excluding communication conspicuously marked otherwise designated writing copyright owner “Contribution.” “Contributor” shall mean Licensor individual Legal Entity behalf Contribution received Licensor subsequently incorporated within Work.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_2-grant-of-copyright-license","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"2. Grant of Copyright License","title":"Apache License","text":"Subject terms conditions License, Contributor hereby grants perpetual, worldwide, non-exclusive, -charge, royalty-free, irrevocable copyright license reproduce, prepare Derivative Works , publicly display, publicly perform, sublicense, distribute Work Derivative Works Source Object form.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_3-grant-of-patent-license","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"3. Grant of Patent License","title":"Apache License","text":"Subject terms conditions License, Contributor hereby grants perpetual, worldwide, non-exclusive, -charge, royalty-free, irrevocable (except stated section) patent license make, made, use, offer sell, sell, import, otherwise transfer Work, license applies patent claims licensable Contributor necessarily infringed Contribution(s) alone combination Contribution(s) Work Contribution(s) submitted. institute patent litigation entity (including cross-claim counterclaim lawsuit) alleging Work Contribution incorporated within Work constitutes direct contributory patent infringement, patent licenses granted License Work shall terminate date litigation filed.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_4-redistribution","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"4. Redistribution","title":"Apache License","text":"may reproduce distribute copies Work Derivative Works thereof medium, without modifications, Source Object form, provided meet following conditions: () must give recipients Work Derivative Works copy License; (b) must cause modified files carry prominent notices stating changed files; (c) must retain, Source form Derivative Works distribute, copyright, patent, trademark, attribution notices Source form Work, excluding notices pertain part Derivative Works; (d) Work includes “NOTICE” text file part distribution, Derivative Works distribute must include readable copy attribution notices contained within NOTICE file, excluding notices pertain part Derivative Works, least one following places: within NOTICE text file distributed part Derivative Works; within Source form documentation, provided along Derivative Works; , within display generated Derivative Works, wherever third-party notices normally appear. contents NOTICE file informational purposes modify License. may add attribution notices within Derivative Works distribute, alongside addendum NOTICE text Work, provided additional attribution notices construed modifying License. may add copyright statement modifications may provide additional different license terms conditions use, reproduction, distribution modifications, Derivative Works whole, provided use, reproduction, distribution Work otherwise complies conditions stated License.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_5-submission-of-contributions","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"5. Submission of Contributions","title":"Apache License","text":"Unless explicitly state otherwise, Contribution intentionally submitted inclusion Work Licensor shall terms conditions License, without additional terms conditions. Notwithstanding , nothing herein shall supersede modify terms separate license agreement may executed Licensor regarding Contributions.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_6-trademarks","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"6. Trademarks","title":"Apache License","text":"License grant permission use trade names, trademarks, service marks, product names Licensor, except required reasonable customary use describing origin Work reproducing content NOTICE file.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_7-disclaimer-of-warranty","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"7. Disclaimer of Warranty","title":"Apache License","text":"Unless required applicable law agreed writing, Licensor provides Work (Contributor provides Contributions) “” BASIS, WITHOUT WARRANTIES CONDITIONS KIND, either express implied, including, without limitation, warranties conditions TITLE, NON-INFRINGEMENT, MERCHANTABILITY, FITNESS PARTICULAR PURPOSE. solely responsible determining appropriateness using redistributing Work assume risks associated exercise permissions License.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_8-limitation-of-liability","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"8. Limitation of Liability","title":"Apache License","text":"event legal theory, whether tort (including negligence), contract, otherwise, unless required applicable law (deliberate grossly negligent acts) agreed writing, shall Contributor liable damages, including direct, indirect, special, incidental, consequential damages character arising result License use inability use Work (including limited damages loss goodwill, work stoppage, computer failure malfunction, commercial damages losses), even Contributor advised possibility damages.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_9-accepting-warranty-or-additional-liability","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"9. Accepting Warranty or Additional Liability","title":"Apache License","text":"redistributing Work Derivative Works thereof, may choose offer, charge fee , acceptance support, warranty, indemnity, liability obligations /rights consistent License. However, accepting obligations, may act behalf sole responsibility, behalf Contributor, agree indemnify, defend, hold Contributor harmless liability incurred , claims asserted , Contributor reason accepting warranty additional liability. END TERMS CONDITIONS","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"appendix-how-to-apply-the-apache-license-to-your-work","dir":"","previous_headings":"","what":"APPENDIX: How to apply the Apache License to your work","title":"Apache License","text":"apply Apache License work, attach following boilerplate notice, fields enclosed brackets [] replaced identifying information. (Don’t include brackets!) text enclosed appropriate comment syntax file format. also recommend file class name description purpose included “printed page” copyright notice easier identification within third-party archives.","code":"Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License."},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/algorithms.html","id":"core-concept","dir":"Articles","previous_headings":"","what":"Core Concept","title":"Algorithms & Sub-Algorithms","text":"SDTM mappings defined algorithms transform collected (eCRF, eDT) source data target SDTM data model. Mapping algorithms backbone {sdtm.oak} - SDTM data transformation engine. Key Points: Algorithms can re-used across multiple SDTM domains. Algorithms pre-specified data collection standards MDR (applicable) facilitate automation. Programming language agnostic - concept rely specific programming language implementation. {sdtm.oak} team implemented R functions. example reusing algorithm across multiple domains, variables, also non-standard","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/algorithms.html","id":"list-of-algorithms","dir":"Articles","previous_headings":"","what":"List of Algorithms","title":"Algorithms & Sub-Algorithms","text":"release {sdtm.oak} supports following algorithms: assign_no_ct, assign_ct, hardcode_no_ct, hardcode_ct, assign_datetime, condition_add. Rest algorithms developed subsequent releases. following table provides brief description algorithm.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/algorithms.html","id":"sub-algorithms","dir":"Articles","previous_headings":"","what":"Sub-algorithms","title":"Algorithms & Sub-Algorithms","text":"{sdtm.oak} supports two levels defining algorithms. example, SDTM mappings certain action taken condition met. cases, primary algorithm checks condition, sub-algorithm executes mappings condition met. Currently, sub-algorithms must provided main algorithms. condition_add dataset_level algorithms can interchangeably used algorithms sub-algorithms seen (exhaustive list) permutation & combination algorithms & sub-algorithms creates endless possibilities accommodate different types mappings.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/cnd_df.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Conditioned Data Frames","text":"Conditioned data frames, cnd_df, powerful tool sdtm.oak package designed facilitate conditional transformations data frames. article explains create use conditioned data frames, particularly context SDTM domain derivations.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/cnd_df.html","id":"creating-conditioned-data-frames","dir":"Articles","previous_headings":"","what":"Creating Conditioned Data Frames","title":"Conditioned Data Frames","text":"conditioned data frame regular data frame extended logical vector cnd marks rows subsequent conditional transformations. condition_add() function used create conditioned data frames.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/cnd_df.html","id":"simple-example","dir":"Articles","previous_headings":"Creating Conditioned Data Frames","what":"Simple Example","title":"Conditioned Data Frames","text":"Consider simple data frame df: can create conditioned data frame rows x > 1 marked: , second third rows marked TRUE.","code":"(df <- tibble(x = 1L:3L, y = letters[1L:3L])) ## # A tibble: 3 × 2 ## x y ## ## 1 1 a ## 2 2 b ## 3 3 c (cnd_df <- condition_add(dat = df, x > 1L)) ## # A tibble: 3 × 2 ## # Cond. tbl: 2/1/0 ## x y ## ## 1 F 1 a ## 2 T 2 b ## 3 T 3 c"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/cnd_df.html","id":"usage-in-sdtm-domain-derivations","dir":"Articles","previous_headings":"","what":"Usage in SDTM Domain Derivations","title":"Conditioned Data Frames","text":"real power conditioned data frames manifests used functions assign_no_ct, assign_ct, hardcode_no_ct, hardcode_ct. functions perform derivations records match pattern TRUE values conditioned data frames.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/cnd_df.html","id":"example-with-concomitant-medications-cm-domain","dir":"Articles","previous_headings":"Usage in SDTM Domain Derivations","what":"Example with Concomitant Medications (CM) Domain","title":"Conditioned Data Frames","text":"Consider simplified dataset concomitant medications, want derive new variable CMGRPID (Concomitant Medication Group ID) based condition medication treatment (CMTRT) \"BENADRYL\". simplified raw Concomitant Medications data set (cm_raw): derive CMTRT variable use assign_no_ct() function map MDRAW variable CMTRT variable: create conditioned data frame target data set (tgt_dat), meaning create conditioned data frame rows CMTRT equal \"BENADRYL\" marked: Finally, derive CMGRPID variable conditionally. Using assign_no_ct(), derive CMGRPID indicates group ID medication, based conditioned target data set: Conditioned data frames sdtm.oak package provide flexible way perform conditional transformations data sets. marking specific rows transformation, users can efficiently derive SDTM variables, ensuring relevant records processed.","code":"cm_raw <- tibble::tibble( oak_id = seq_len(14L), raw_source = \"ConMed\", patient_number = c(375L, 375L, 376L, 377L, 377L, 377L, 377L, 378L, 378L, 378L, 378L, 379L, 379L, 379L), MDNUM = c(1L, 2L, 1L, 1L, 2L, 3L, 5L, 4L, 1L, 2L, 3L, 1L, 2L, 3L), MDRAW = c( \"BABY ASPIRIN\", \"CORTISPORIN\", \"ASPIRIN\", \"DIPHENHYDRAMINE HCL\", \"PARCETEMOL\", \"VOMIKIND\", \"ZENFLOX OZ\", \"AMITRYPTYLINE\", \"BENADRYL\", \"DIPHENHYDRAMINE HYDROCHLORIDE\", \"TETRACYCLINE\", \"BENADRYL\", \"SOMINEX\", \"ZQUILL\" ) ) cm_raw ## # A tibble: 14 × 5 ## oak_id raw_source patient_number MDNUM MDRAW ## ## 1 1 ConMed 375 1 BABY ASPIRIN ## 2 2 ConMed 375 2 CORTISPORIN ## 3 3 ConMed 376 1 ASPIRIN ## 4 4 ConMed 377 1 DIPHENHYDRAMINE HCL ## 5 5 ConMed 377 2 PARCETEMOL ## 6 6 ConMed 377 3 VOMIKIND ## 7 7 ConMed 377 5 ZENFLOX OZ ## 8 8 ConMed 378 4 AMITRYPTYLINE ## 9 9 ConMed 378 1 BENADRYL ## 10 10 ConMed 378 2 DIPHENHYDRAMINE HYDROCHLORIDE ## 11 11 ConMed 378 3 TETRACYCLINE ## 12 12 ConMed 379 1 BENADRYL ## 13 13 ConMed 379 2 SOMINEX ## 14 14 ConMed 379 3 ZQUILL tgt_dat <- assign_no_ct( tgt_var = \"CMTRT\", raw_dat = cm_raw, raw_var = \"MDRAW\" ) tgt_dat ## # A tibble: 14 × 4 ## oak_id raw_source patient_number CMTRT ## ## 1 1 ConMed 375 BABY ASPIRIN ## 2 2 ConMed 375 CORTISPORIN ## 3 3 ConMed 376 ASPIRIN ## 4 4 ConMed 377 DIPHENHYDRAMINE HCL ## 5 5 ConMed 377 PARCETEMOL ## 6 6 ConMed 377 VOMIKIND ## 7 7 ConMed 377 ZENFLOX OZ ## 8 8 ConMed 378 AMITRYPTYLINE ## 9 9 ConMed 378 BENADRYL ## 10 10 ConMed 378 DIPHENHYDRAMINE HYDROCHLORIDE ## 11 11 ConMed 378 TETRACYCLINE ## 12 12 ConMed 379 BENADRYL ## 13 13 ConMed 379 SOMINEX ## 14 14 ConMed 379 ZQUILL (cnd_tgt_dat <- condition_add(tgt_dat, CMTRT == \"BENADRYL\")) ## # A tibble: 14 × 4 ## # Cond. tbl: 2/12/0 ## oak_id raw_source patient_number CMTRT ## ## 1 F 1 ConMed 375 BABY ASPIRIN ## 2 F 2 ConMed 375 CORTISPORIN ## 3 F 3 ConMed 376 ASPIRIN ## 4 F 4 ConMed 377 DIPHENHYDRAMINE HCL ## 5 F 5 ConMed 377 PARCETEMOL ## 6 F 6 ConMed 377 VOMIKIND ## 7 F 7 ConMed 377 ZENFLOX OZ ## 8 F 8 ConMed 378 AMITRYPTYLINE ## 9 T 9 ConMed 378 BENADRYL ## 10 F 10 ConMed 378 DIPHENHYDRAMINE HYDROCHLORIDE ## 11 F 11 ConMed 378 TETRACYCLINE ## 12 T 12 ConMed 379 BENADRYL ## 13 F 13 ConMed 379 SOMINEX ## 14 F 14 ConMed 379 ZQUILL derived_tgt_dat <- assign_no_ct( tgt_dat = cnd_tgt_dat, tgt_var = \"CMGRPID\", raw_dat = cm_raw, raw_var = \"MDNUM\" ) derived_tgt_dat ## # A tibble: 14 × 5 ## oak_id raw_source patient_number CMTRT CMGRPID ## ## 1 1 ConMed 375 BABY ASPIRIN NA ## 2 2 ConMed 375 CORTISPORIN NA ## 3 3 ConMed 376 ASPIRIN NA ## 4 4 ConMed 377 DIPHENHYDRAMINE HCL NA ## 5 5 ConMed 377 PARCETEMOL NA ## 6 6 ConMed 377 VOMIKIND NA ## 7 7 ConMed 377 ZENFLOX OZ NA ## 8 8 ConMed 378 AMITRYPTYLINE NA ## 9 9 ConMed 378 BENADRYL 1 ## 10 10 ConMed 378 DIPHENHYDRAMINE HYDROCHLORIDE NA ## 11 11 ConMed 378 TETRACYCLINE NA ## 12 12 ConMed 379 BENADRYL 1 ## 13 13 ConMed 379 SOMINEX NA ## 14 14 ConMed 379 ZQUILL NA"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Creating an Events SDTM domain","text":"article describes creating Events SDTM domain using sdtm.oak package. Examples currently presented tested context CM domain.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"raw-data","dir":"Articles","previous_headings":"","what":"Raw data","title":"Creating an Events SDTM domain","text":"Raw datasets can exported EDC systems format collected. example used provides raw dataset Concomitant medications, collected data represented columns subject. example, Medication Name(MDRAW), Medication Start Date (MDBDR), Start Time (MDBTM), End Date (MDEDR), End time (MDETM), etc. represented columns.format commonly used EDC systems. raw dataset presented :","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"programming-workflow","dir":"Articles","previous_headings":"","what":"Programming workflow","title":"Creating an Events SDTM domain","text":"{sdtm.oak} process one raw dataset time. Similar raw datasets (example Concomitant medications (OID - cm_raw), Targeted Concomitant Medications (OID - cm_t_raw)) can stacked together processing. Read data Create oak_id_vars Read CT Map Topic Variable assign_no_ct assign_ct assign_datetime hardcode_ct condition_add hardcode_no_ct condition_add condition_add involving target domain condition_add involving raw dataset target domain Repeat Map Topic Map Rest Repeat steps different raw datasets proceeding steps. Create SDTM derived variables Add Labels Attributes","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"readdata","dir":"Articles","previous_headings":"Programming workflow","what":"Read in data","title":"Creating an Events SDTM domain","text":"Read raw datasets environment. example, raw dataset name cm_raw. Users can read package using code:","code":"cm_raw <- read.csv(system.file(\"raw_data/cm_raw_data.csv\", package = \"sdtm.oak\" ))"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"oakidvars","dir":"Articles","previous_headings":"Programming workflow","what":"Create oak_id_vars","title":"Creating an Events SDTM domain","text":"oak_id_vars crucial link raw datasets mapped SDTM domain. user derives SDTM variable, merged corresponding topic variable using oak_id_vars. {sdtm.oak}, variables oak_id, raw_source, patient_number considered oak_id_vars. three variables must added raw datasets. used multiple places programming. oak_id:- Type: numeric- Value: equal raw dataframe row number. raw_source:- Type: Character- Value: equal raw dataset (eCRF) name eDT dataset name. patient_number:- Type: numeric- Value: equal subject number CRF NonCRF data source. Read DM domain","code":"cm_raw <- cm_raw %>% generate_oak_id_vars( pat_var = \"PATNUM\", raw_src = \"cm_raw\" ) dm <- read.csv(system.file(\"raw_data/dm.csv\", package = \"sdtm.oak\" ))"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"readct","dir":"Articles","previous_headings":"Programming workflow","what":"Read in CT","title":"Creating an Events SDTM domain","text":"Controlled Terminology part SDTM specification prepared user. example, study controlled terminology name sdtm_ct.csv. Users can read package using code:","code":"study_ct <- read.csv(system.file(\"raw_data/sdtm_ct.csv\", package = \"sdtm.oak\" ))"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"maptopic","dir":"Articles","previous_headings":"Programming workflow","what":"Map Topic Variable","title":"Creating an Events SDTM domain","text":"topic variable mapped first step mapping process. primary variable SDTM domain. rest variables add definition topic variable. example, topic variable CMTRT. mapped raw dataset column MDRAW. mapping logic Map collected value cm_raw dataset MDRAW variable CM.CMTRT. mapping involve controlled terminology. assign_no_ct function used mapping. topic variable mapped, Qualifier, Identifier, Timing variables can mapped.","code":"cm <- # Map topic variable assign_no_ct( raw_dat = cm_raw, raw_var = \"MDRAW\", tgt_var = \"CMTRT\" )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"maprest","dir":"Articles","previous_headings":"Programming workflow","what":"Map Rest of the Variables","title":"Creating an Events SDTM domain","text":"Qualifiers, Identifiers, Timing Variables can mapped order. example, map variable one one demonstrate different mapping algorithms.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"assign_no_ct","dir":"Articles","previous_headings":"Programming workflow > Map Rest of the Variables","what":"assign_no_ct","title":"Creating an Events SDTM domain","text":"mapping logic CMGRPID Map collected value cm_raw dataset MDNUM variable CM.CMGRPID. CMGRPID added corresponding CMTRT based ‘oak_id_vars’. calling function, parameter ‘id_vars = oak_id_vars()’ matches raw dataset ‘oak_id_vars’ ‘oak_id_vars’ cm domain created previous step. ’s important note ‘oak_id_vars’ can extended include user-defined variables. cases, three variables suffice.","code":"cm <- cm %>% # Map CMGRPID assign_no_ct( raw_dat = cm_raw, raw_var = \"MDNUM\", tgt_var = \"CMGRPID\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"assign_ct","dir":"Articles","previous_headings":"Programming workflow > Map Rest of the Variables","what":"assign_ct","title":"Creating an Events SDTM domain","text":"mapping logic CMDOSU Map collected value cm_raw dataset DOSU variable CM.CMDOSU. controlled terminology used map collected value standard value. assign_ct right algorithm perform mapping.","code":"cm <- cm %>% # Map qualifier CMDOSU assign_ct( raw_dat = cm_raw, raw_var = \"DOSU\", tgt_var = \"CMDOSU\", ct_spec = study_ct, ct_clst = \"C71620\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"assign_datetime","dir":"Articles","previous_headings":"Programming workflow > Map Rest of the Variables","what":"assign_datetime","title":"Creating an Events SDTM domain","text":"mapping logic CMSTDTC Map collected value cm_raw dataset MDBDR (start date) variable MDBTM (start time) CM.CMSTDTC. collected date value format ‘dd mmm yyyy’. collected time value ‘H”M’ format. assign_datetime function used map collected value ISO8601 format.","code":"cm <- cm %>% # Map CMSTDTC. This function calls create_iso8601 assign_datetime( raw_dat = cm_raw, raw_var = c(\"MDBDR\", \"MDBTM\"), tgt_var = \"CMSTDTC\", raw_fmt = c(list(c(\"d-m-y\", \"dd mmm yyyy\")), \"H:M\"), raw_unk = c(\"UN\", \"UNK\"), id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"hardcode_ct","dir":"Articles","previous_headings":"Programming workflow > Map Rest of the Variables","what":"hardcode_ct and condition_add","title":"Creating an Events SDTM domain","text":"mapping logic CMSTRTPT follows: collected value raw variable MDPRIOR raw dataset cm_raw equals 1, CM.CMSTRTPT == ''. hardcode_ct function used map CMSTRTPT involves hardcoding specific value SDTM variable controlled terminology. condition_add function filters raw dataset based particular condition, hardcode_ct function performs mapping. two functions used together, condition_add function first filters raw dataset based specified condition. Next, filtered dataset passed hardcode_ct function assign appropriate value. example illustrates hardcode_ct algorithm functions sub-algorithm condition_add. condition_add function adds additional metadata records raw dataset meets condition. Refer function documentation details. hardcode_ct function uses additional metadata find records meet criteria map accordingly.","code":"cm <- cm %>% # Map qualifier CMSTRTPT Annotation text is If MDPRIOR == 1 then CM.CMSTRTPT = 'BEFORE' hardcode_ct( raw_dat = condition_add(cm_raw, MDPRIOR == \"1\"), raw_var = \"MDPRIOR\", tgt_var = \"CMSTRTPT\", tgt_val = \"BEFORE\", ct_spec = study_ct, ct_clst = \"C66728\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"hardcode_no_ct","dir":"Articles","previous_headings":"Programming workflow > Map Rest of the Variables","what":"hardcode_no_ct and condition_add","title":"Creating an Events SDTM domain","text":"mapping logic CMSTTPT follows: collected value raw variable MDPRIOR raw dataset cm_raw equals 1, CM.CMSTTPT == 'SCREENING'. hardcode_no_ct function used map CMSTTPT involves hardcoding specific value SDTM variable without controlled terminology. condition_add function filters raw dataset based particular condition, hardcode_no_ct function performs mapping.","code":"cm <- cm %>% # Map qualifier CMSTTPT Annotation text is If MDPRIOR == 1 then CM.CMSTTPT = 'SCREENING' hardcode_no_ct( raw_dat = condition_add(cm_raw, MDPRIOR == \"1\"), raw_var = \"MDPRIOR\", tgt_var = \"CMSTTPT\", tgt_val = \"SCREENING\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"condition_add_tar","dir":"Articles","previous_headings":"Programming workflow > Map Rest of the Variables","what":"condition_add involving target domain","title":"Creating an Events SDTM domain","text":"mapping CMSTRTPT CMSTTTPT, condition_add function used raw dataset. mapping, can explore use condition_add add filter condition based target SDTM variable. mapping logic CMDOSFRQ CMTRT null, map collected value raw dataset cm_raw raw variable MDFRQ CMDOSFRQ. may may represent valid SDTM mapping actual study, can used example. mapping, condition_add function filters cm domain created previous step adds metadata records meets condition. assign_ct function uses additional metadata find records meet criteria map accordingly. Remember use additional curly braces function call using condition_add function target dataset. necessary input target dataset represented . passed previous step using {magrittr} pipe operator. Currently, limitation using nested function call . reference one input parameters, recommended approach overcome . placeholder . use {magrittr} pipe %>% operator. encourage using . {magrittr} pipe %>% operator using {sdtm.oak} functions. Another way achieve outcome moving ‘condition_by’ call one level, illustrated : required use {magrittr} pipe %>% curly braces case.","code":"cm <- cm %>% # Map qualifier CMDOSFRQ Annotation text is If CMTRT is not null then map # the collected value in raw dataset cm_raw and raw variable MDFRQ to CMDOSFRQ { assign_ct( raw_dat = cm_raw, raw_var = \"MDFRQ\", tgt_dat = condition_add(., !is.na(CMTRT)), tgt_var = \"CMDOSFRQ\", ct_spec = study_ct, ct_clst = \"C66728\", id_vars = oak_id_vars() ) } cm <- cm %>% condition_add(!is.na(CMTRT)) %>% assign_ct( raw_dat = cm_raw, raw_var = \"DOSU\", tgt_var = \"CMDOSU\", ct_spec = study_ct, ct_clst = \"C71620\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"condition_add_raw_tar","dir":"Articles","previous_headings":"Programming workflow > Map Rest of the Variables","what":"condition_add involving raw dataset and target domain","title":"Creating an Events SDTM domain","text":"mapping, can explore use condition_add add filter condition based target SDTM variable. mapping logic CMMODIFY collected value MODIFY cm_raw different CM.CMTRT assign collected value CMMODIFY CM domain (CM.CMMODIFY). assign_no_ct function used map CMMODIFY involves mapping collected value SDTM variable without controlled terminology. condition_add function filters raw dataset & target dataset based particular condition, assign_no_ct function performs mapping. Another way achieve outcome moving ‘condition_by’ call one level, illustrated : required use {magrittr} pipe %>% curly braces case. Now, complete mapping rest SDTM variables.","code":"cm <- cm %>% # Map CMMODIFY Annotation text If collected value in MODIFY in cm_raw is # different to CM.CMTRT then assign the collected value to CMMODIFY in # CM domain (CM.CMMODIFY) { assign_no_ct( raw_dat = cm_raw, raw_var = \"MODIFY\", tgt_dat = condition_add(., MODIFY != CMTRT, .dat2 = cm_raw), tgt_var = \"CMMODIFY\", id_vars = oak_id_vars() ) } cm <- cm %>% condition_add(MODIFY != CMTRT, .dat2 = cm_raw) %>% assign_no_ct( raw_dat = cm_raw, raw_var = \"MODIFY\", tgt_var = \"CMMODIFY\", id_vars = oak_id_vars() ) cm <- cm %>% # Map CMINDC as the collected value in MDIND to CM.CMINDC assign_no_ct( raw_dat = cm_raw, raw_var = \"MDIND\", tgt_var = \"CMINDC\", id_vars = oak_id_vars() ) %>% # Map CMENDTC as the collected value in MDEDR and MDETM to CM.CMENDTC. # This function calls create_iso8601 assign_datetime( raw_dat = cm_raw, raw_var = c(\"MDEDR\", \"MDETM\"), tgt_var = \"CMENDTC\", raw_fmt = c(\"d-m-y\", \"H:M\"), raw_unk = c(\"UN\", \"UNK\") ) %>% # Map qualifier CMENRTPT as If MDONG == 1 then CM.CMENRTPT = 'ONGOING' hardcode_ct( raw_dat = condition_add(cm_raw, MDONG == \"1\"), raw_var = \"MDONG\", tgt_var = \"CMENRTPT\", tgt_val = \"ONGOING\", ct_spec = study_ct, ct_clst = \"C66728\", id_vars = oak_id_vars() ) %>% # Map qualifier CMENTPT as If MDONG == 1 then CM.CMENTPT = 'DATE OF LAST ASSESSMENT' hardcode_no_ct( raw_dat = condition_add(cm_raw, MDONG == \"1\"), raw_var = \"MDONG\", tgt_var = \"CMENTPT\", tgt_val = \"DATE OF LAST ASSESSMENT\", id_vars = oak_id_vars() ) %>% # Map qualifier CMDOS as If collected value in raw_var DOS is numeric then CM.CMDOSE assign_no_ct( raw_dat = condition_add(cm_raw, is.numeric(DOS)), raw_var = \"DOS\", tgt_var = \"CMDOS\", id_vars = oak_id_vars() ) %>% # Map qualifier CMDOS as If collected value in raw_var DOS is character then CM.CMDOSTXT assign_no_ct( raw_dat = condition_add(cm_raw, is.character(DOS)), raw_var = \"DOS\", tgt_var = \"CMDOSTXT\", id_vars = oak_id_vars() ) %>% # Map qualifier CMDOSU as the collected value in the cm_raw dataset DOSU variable to CM.CMDOSU assign_ct( raw_dat = cm_raw, raw_var = \"DOSU\", tgt_var = \"CMDOSU\", ct_spec = study_ct, ct_clst = \"C71620\", id_vars = oak_id_vars() ) %>% # Map qualifier CMDOSFRM as the collected value in the cm_raw dataset MDFORM variable to CM.CMDOSFRM assign_ct( raw_dat = cm_raw, raw_var = \"MDFORM\", tgt_var = \"CMDOSFRM\", ct_spec = study_ct, ct_clst = \"C66726\", id_vars = oak_id_vars() ) %>% # Map CMROUTE as the collected value in the cm_raw dataset MDRTE variable to CM.CMROUTE assign_ct( raw_dat = cm_raw, raw_var = \"MDRTE\", tgt_var = \"CMROUTE\", ct_spec = study_ct, ct_clst = \"C66729\", id_vars = oak_id_vars() ) %>% # Map qualifier CMPROPH as If MDPROPH == 1 then CM.CMPROPH = 'Y' hardcode_ct( raw_dat = condition_add(cm_raw, MDPROPH == \"1\"), raw_var = \"MDPROPH\", tgt_var = \"CMPROPH\", tgt_val = \"Y\", ct_spec = study_ct, ct_clst = \"C66742\", id_vars = oak_id_vars() ) %>% # Map CMDRG as the collected value in the cm_raw dataset CMDRG variable to CM.CMDRG assign_no_ct( raw_dat = cm_raw, raw_var = \"CMDRG\", tgt_var = \"CMDRG\", id_vars = oak_id_vars() ) %>% # Map CMDRGCD as the collected value in the cm_raw dataset CMDRGCD variable to CM.CMDRGCD assign_no_ct( raw_dat = cm_raw, raw_var = \"CMDRGCD\", tgt_var = \"CMDRGCD\", id_vars = oak_id_vars() ) %>% # Map CMDECOD as the collected value in the cm_raw dataset CMDECOD variable to CM.CMDECOD assign_no_ct( raw_dat = cm_raw, raw_var = \"CMDECOD\", tgt_var = \"CMDECOD\", id_vars = oak_id_vars() ) %>% # Map CMPNCD as the collected value in the cm_raw dataset CMPNCD variable to CM.CMPNCD assign_no_ct( raw_dat = cm_raw, raw_var = \"CMPNCD\", tgt_var = \"CMPNCD\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"repeatsteps","dir":"Articles","previous_headings":"Programming workflow","what":"Repeat Map Topic and Map Rest","title":"Creating an Events SDTM domain","text":"one topic variable raw data source, additional topic variable mappings. Users can proceed next step. required one topic variable map.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"derivedvars","dir":"Articles","previous_headings":"Programming workflow","what":"Create SDTM derived variables","title":"Creating an Events SDTM domain","text":"SDTM derived variables SDTM mapping applicable records cm dataset produced previous step cam created now. example, create CMSEQ variable. mapping logic Create sequence number record CM domain.","code":"cm <- cm %>% # The below mappings are applicable to all the records in the cm domain, # hence can be derived using mutate statement. dplyr::mutate( STUDYID = \"test_study\", DOMAIN = \"CM\", CMCAT = \"GENERAL CONMED\", USUBJID = paste0(\"test_study\", \"-\", cm_raw$PATNUM) ) %>% # derive sequence number # derive_seq(tgt_var = \"CMSEQ\", # rec_vars= c(\"USUBJID\", \"CMGRPID\")) %>% derive_study_day( sdtm_in = ., dm_domain = dm, tgdt = \"CMENDTC\", refdt = \"RFXSTDTC\", study_day_var = \"CMENDY\" ) %>% derive_study_day( sdtm_in = ., dm_domain = dm, tgdt = \"CMSTDTC\", refdt = \"RFXSTDTC\", study_day_var = \"CMSTDY\" ) %>% # Add code for derive Baseline flag. dplyr::select(\"STUDYID\", \"DOMAIN\", \"USUBJID\", everything())"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"attributes","dir":"Articles","previous_headings":"Programming workflow","what":"Add Labels and Attributes","title":"Creating an Events SDTM domain","text":"Yet developed.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Creating an Findings SDTM domain","text":"article describes create Findings SDTM domain using {sdtm.oak} package. Examples currently presented tested context VS domain. reading article, recommended users review “Creating Events Domain” article, provides detailed explanation various concepts {sdtm.oak}, oak_id_vars, condition_add, etc. also offers guidance mapping algorithms functions use different mappings provides detailed explanation mapping algorithms functions work. article, dive directly programming provide explanation required.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"programming-workflow","dir":"Articles","previous_headings":"","what":"Programming workflow","title":"Creating an Findings SDTM domain","text":"{sdtm.oak} process one raw dataset time. Similar raw datasets (example Vital Signs - Screening (OID - vs_raw), Vital Signs - Treatment (OID - vs_t_raw)) can stacked together processing. Read data Create oak_id_vars Read CT Map Topic Variable Map Rest Variables Repeat Map Topic Map Rest Repeat steps different raw datasets proceeding steps. Create SDTM derived variables Add Labels Attributes","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"readdata","dir":"Articles","previous_headings":"Programming workflow","what":"Read in data","title":"Creating an Findings SDTM domain","text":"Read raw datasets environment. example, raw dataset name vs_raw. Users can read package using code:","code":"vs_raw <- read.csv(system.file(\"raw_data/vitals_raw_data.csv\", package = \"sdtm.oak\" ))"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"oakidvars","dir":"Articles","previous_headings":"Programming workflow","what":"Create oak_id_vars","title":"Creating an Findings SDTM domain","text":"Read DM domain","code":"vs_raw <- vs_raw %>% generate_oak_id_vars( pat_var = \"PATNUM\", raw_src = \"vitals\" )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"readct","dir":"Articles","previous_headings":"Programming workflow","what":"Read in CT","title":"Creating an Findings SDTM domain","text":"Controlled Terminology part SDTM specification prepared user. example, study controlled terminology name sdtm_ct.csv. Users can read package using code:","code":"study_ct <- read.csv(system.file(\"raw_data/sdtm_ct.csv\", package = \"sdtm.oak\" ))"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"maptopic","dir":"Articles","previous_headings":"Programming workflow","what":"Map Topic Variable","title":"Creating an Findings SDTM domain","text":"raw dataset multiple topic variables. Lets start first topic variable. Map topic variable SYSBP raw variable SYS_BP.","code":"# Map topic variable SYSBP and its qualifiers. vs_sysbp <- hardcode_ct( raw_dat = vs_raw, raw_var = \"SYS_BP\", tgt_var = \"VSTESTCD\", tgt_val = \"SYSBP\", ct_spec = study_ct, ct_clst = \"C66741\" ) %>% # Filter for records where VSTESTCD is not empty. # Only these records need qualifier mappings. dplyr::filter(!is.na(.data$VSTESTCD))"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"maprest","dir":"Articles","previous_headings":"Programming workflow","what":"Map Rest of the Variables","title":"Creating an Findings SDTM domain","text":"Map rest variables applicable topic variable SYSBP. can include qualifiers, identifier timing variables.","code":"# Map topic variable SYSBP and its qualifiers. vs_sysbp <- vs_sysbp %>% # Map VSTEST using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"SYS_BP\", tgt_var = \"VSTEST\", tgt_val = \"Systolic Blood Pressure\", ct_spec = study_ct, ct_clst = \"C67153\", id_vars = oak_id_vars() ) %>% # Map VSORRES using assign_no_ct algorithm assign_no_ct( raw_dat = vs_raw, raw_var = \"SYS_BP\", tgt_var = \"VSORRES\", id_vars = oak_id_vars() ) %>% # Map VSORRESU using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"SYS_BP\", tgt_var = \"VSORRESU\", tgt_val = \"mmHg\", ct_spec = study_ct, ct_clst = \"C66770\", id_vars = oak_id_vars() ) %>% # Map VSPOS using assign_ct algorithm assign_ct( raw_dat = vs_raw, raw_var = \"SUBPOS\", tgt_var = \"VSPOS\", ct_spec = study_ct, ct_clst = \"C71148\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"repeatsteps","dir":"Articles","previous_headings":"Programming workflow","what":"Repeat Map Topic and Map Rest","title":"Creating an Findings SDTM domain","text":"raw data source topic variables DIABP, PULSE, RESP, TEMP, OXYSAT, VSALL corresponding qualifiers. Repeat mapping topic qualifiers topic variable. Now topic variable qualifier mappings complete, combine datasets proceed mapping qualifiers, identifiers timing variables applicable topic variables.","code":"# Map topic variable DIABP and its qualifiers. vs_diabp <- hardcode_ct( raw_dat = vs_raw, raw_var = \"DIA_BP\", tgt_var = \"VSTESTCD\", tgt_val = \"DIABP\", ct_spec = study_ct, ct_clst = \"C66741\" ) %>% dplyr::filter(!is.na(.data$VSTESTCD)) %>% # Map VSTEST using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"DIA_BP\", tgt_var = \"VSTEST\", tgt_val = \"Diastolic Blood Pressure\", ct_spec = study_ct, ct_clst = \"C67153\", id_vars = oak_id_vars() ) %>% # Map VSORRES using assign_no_ct algorithm assign_no_ct( raw_dat = vs_raw, raw_var = \"DIA_BP\", tgt_var = \"VSORRES\", id_vars = oak_id_vars() ) %>% # Map VSORRESU using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"DIA_BP\", tgt_var = \"VSORRESU\", tgt_val = \"mmHg\", ct_spec = study_ct, ct_clst = \"C66770\", id_vars = oak_id_vars() ) %>% # Map VSPOS using assign_ct algorithm assign_ct( raw_dat = vs_raw, raw_var = \"SUBPOS\", tgt_var = \"VSPOS\", ct_spec = study_ct, ct_clst = \"C71148\", id_vars = oak_id_vars() ) # Map topic variable PULSE and its qualifiers. vs_pulse <- hardcode_ct( raw_dat = vs_raw, raw_var = \"PULSE\", tgt_var = \"VSTESTCD\", tgt_val = \"PULSE\", ct_spec = study_ct, ct_clst = \"C66741\" ) %>% dplyr::filter(!is.na(.data$VSTESTCD)) %>% # Map VSTEST using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"PULSE\", tgt_var = \"VSTEST\", tgt_val = \"Pulse Rate\", ct_spec = study_ct, ct_clst = \"C67153\", id_vars = oak_id_vars() ) %>% # Map VSORRES using assign_no_ct algorithm assign_no_ct( raw_dat = vs_raw, raw_var = \"PULSE\", tgt_var = \"VSORRES\", id_vars = oak_id_vars() ) %>% # Map VSORRESU using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"PULSE\", tgt_var = \"VSORRESU\", tgt_val = \"beats/min\", ct_spec = study_ct, ct_clst = \"C66770\", id_vars = oak_id_vars() ) # Map topic variable RESP from the raw variable RESPRT and its qualifiers. vs_resp <- hardcode_ct( raw_dat = vs_raw, raw_var = \"RESPRT\", tgt_var = \"VSTESTCD\", tgt_val = \"RESP\", ct_spec = study_ct, ct_clst = \"C66741\" ) %>% dplyr::filter(!is.na(.data$VSTESTCD)) %>% # Map VSTEST using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"RESPRT\", tgt_var = \"VSTEST\", tgt_val = \"Respiratory Rate\", ct_spec = study_ct, ct_clst = \"C67153\", id_vars = oak_id_vars() ) %>% # Map VSORRES using assign_no_ct algorithm assign_no_ct( raw_dat = vs_raw, raw_var = \"RESPRT\", tgt_var = \"VSORRES\", id_vars = oak_id_vars() ) %>% # Map VSORRESU using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"RESPRT\", tgt_var = \"VSORRESU\", tgt_val = \"breaths/min\", ct_spec = study_ct, ct_clst = \"C66770\", id_vars = oak_id_vars() ) # Map topic variable TEMP from raw variable TEMP and its qualifiers. vs_temp <- hardcode_ct( raw_dat = vs_raw, raw_var = \"TEMP\", tgt_var = \"VSTESTCD\", tgt_val = \"TEMP\", ct_spec = study_ct, ct_clst = \"C66741\" ) %>% dplyr::filter(!is.na(.data$VSTESTCD)) %>% # Map VSTEST using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"TEMP\", tgt_var = \"VSTEST\", tgt_val = \"Temperature\", ct_spec = study_ct, ct_clst = \"C67153\", id_vars = oak_id_vars() ) %>% # Map VSORRES using assign_no_ct algorithm assign_no_ct( raw_dat = vs_raw, raw_var = \"TEMP\", tgt_var = \"VSORRES\", id_vars = oak_id_vars() ) %>% # Map VSORRESU using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"TEMP\", tgt_var = \"VSORRESU\", tgt_val = \"C\", ct_spec = study_ct, ct_clst = \"C66770\", id_vars = oak_id_vars() ) %>% # Map VSLOC from TEMPLOC using assign_ct assign_ct( raw_dat = vs_raw, raw_var = \"TEMPLOC\", tgt_var = \"VSLOC\", ct_spec = study_ct, ct_clst = \"C74456\", id_vars = oak_id_vars() ) # Map topic variable OXYSAT from raw variable OXY_SAT and its qualifiers. vs_oxysat <- hardcode_ct( raw_dat = vs_raw, raw_var = \"OXY_SAT\", tgt_var = \"VSTESTCD\", tgt_val = \"OXYSAT\", ct_spec = study_ct, ct_clst = \"C66741\" ) %>% dplyr::filter(!is.na(.data$VSTESTCD)) %>% # Map VSTEST using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"OXY_SAT\", tgt_var = \"VSTEST\", tgt_val = \"Oxygen Saturation\", ct_spec = study_ct, ct_clst = \"C67153\", id_vars = oak_id_vars() ) %>% # Map VSORRES using assign_no_ct algorithm assign_no_ct( raw_dat = vs_raw, raw_var = \"OXY_SAT\", tgt_var = \"VSORRES\", id_vars = oak_id_vars() ) %>% # Map VSORRESU using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"OXY_SAT\", tgt_var = \"VSORRESU\", tgt_val = \"%\", ct_spec = study_ct, ct_clst = \"C66770\", id_vars = oak_id_vars() ) %>% # Map VSLAT using assign_ct from raw variable LAT assign_ct( raw_dat = vs_raw, raw_var = \"LAT\", tgt_var = \"VSLAT\", ct_spec = study_ct, ct_clst = \"C99073\", id_vars = oak_id_vars() ) %>% # Map VSLOC using assign_ct from raw variable LOC assign_ct( raw_dat = vs_raw, raw_var = \"LOC\", tgt_var = \"VSLOC\", ct_spec = study_ct, ct_clst = \"C74456\", id_vars = oak_id_vars() ) # Map topic variable VSALL from raw variable ASMNTDN with the logic if ASMNTDN == 1 then VSTESTCD = VSALL vs_vsall <- hardcode_ct( raw_dat = condition_add(vs_raw, ASMNTDN == 1L), raw_var = \"ASMNTDN\", tgt_var = \"VSTESTCD\", tgt_val = \"VSALL\", ct_spec = study_ct, ct_clst = \"C66741\" ) %>% dplyr::filter(!is.na(.data$VSTESTCD)) %>% # Map VSTEST using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"ASMNTDN\", tgt_var = \"VSTEST\", tgt_val = \"Vital Signs\", ct_spec = study_ct, ct_clst = \"C67153\", id_vars = oak_id_vars() ) # Combine all the topic variables into a single data frame and map qualifiers # applicable to all topic variables vs <- dplyr::bind_rows( vs_vsall, vs_sysbp, vs_diabp, vs_pulse, vs_resp, vs_temp, vs_oxysat ) %>% # Map qualifiers common to all topic variables # Map VSDTC using assign_ct algorithm assign_datetime( raw_dat = vs_raw, raw_var = c(\"VTLD\", \"VTLTM\"), tgt_var = \"VSDTC\", raw_fmt = c(list(c(\"d-m-y\", \"dd-mmm-yyyy\")), \"H:M\") ) %>% # Map VSTPT from TMPTC using assign_ct assign_ct( raw_dat = vs_raw, raw_var = \"TMPTC\", tgt_var = \"VSTPT\", ct_spec = study_ct, ct_clst = \"TPT\", id_vars = oak_id_vars() ) %>% # Map VSTPTNUM from TMPTC using assign_ct assign_ct( raw_dat = vs_raw, raw_var = \"TMPTC\", tgt_var = \"VSTPTNUM\", ct_spec = study_ct, ct_clst = \"TPTNUM\", id_vars = oak_id_vars() ) %>% # Map VISIT from INSTANCE using assign_ct assign_ct( raw_dat = vs_raw, raw_var = \"INSTANCE\", tgt_var = \"VISIT\", ct_spec = study_ct, ct_clst = \"VISIT\", id_vars = oak_id_vars() ) %>% # Map VISITNUM from INSTANCE using assign_ct assign_ct( raw_dat = vs_raw, raw_var = \"INSTANCE\", tgt_var = \"VISITNUM\", ct_spec = study_ct, ct_clst = \"VISITNUM\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"derivedvars","dir":"Articles","previous_headings":"Programming workflow","what":"Create SDTM derived variables","title":"Creating an Findings SDTM domain","text":"Create derived variables applicable topic variables.","code":"vs <- vs %>% dplyr::mutate( STUDYID = \"test_study\", DOMAIN = \"VS\", VSCAT = \"VITAL SIGNS\", USUBJID = paste0(\"test_study\", \"-\", .data$patient_number) ) %>% # derive_seq(tgt_var = \"VSSEQ\", # rec_vars= c(\"USUBJID\", \"VSTRT\")) %>% derive_study_day( sdtm_in = ., dm_domain = dm, tgdt = \"VSDTC\", refdt = \"RFXSTDTC\", study_day_var = \"VSDY\" ) %>% dplyr::select(\"STUDYID\", \"DOMAIN\", \"USUBJID\", everything())"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"attributes","dir":"Articles","previous_headings":"Programming workflow","what":"Add Labels and Attributes","title":"Creating an Findings SDTM domain","text":"Yet developed.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/iso_8601.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Converting dates, times or date-times to ISO 8601","text":"perform conversion ISO 8601 format need pass two key arguments: least one vector dates, times, date-times character type; date/time format via .format parameter instructs create_iso8601() date/time components expect. default .format parameter understands reserved characters: \"y\" year \"m\" month \"d\" day \"H\" hours \"M\" minutes \"S\" seconds Besides character vectors dates times, may also pass single vector date-times, provided adjust format:","code":"create_iso8601(\"2000 01 05\", .format = \"y m d\") #> [1] \"2000-01-05\" create_iso8601(\"22:35:05\", .format = \"H:M:S\") #> [1] \"-----T22:35:05\" create_iso8601(\"2000-01-05 22:35:05\", .format = \"y-m-d H:M:S\") #> [1] \"2000-01-05T22:35:05\""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/iso_8601.html","id":"multiple-inputs","dir":"Articles","previous_headings":"","what":"Multiple inputs","title":"Converting dates, times or date-times to ISO 8601","text":"dates times separate vectors need pass format vector: addition, like R functions take vectors input, create_iso8601() vectorized: number elements inputs match get error: can combine individual date time components coming separate inputs; contrived example year, month day together, hour, minute: .format argument must always named; otherwise, treated one inputs interpreted missing.","code":"create_iso8601(\"2000-01-05\", \"22:35:05\", .format = c(\"y-m-d\", \"H:M:S\")) #> [1] \"2000-01-05T22:35:05\" date <- c(\"2000-01-05\", \"2001-12-25\", \"1980-06-18\", \"1979-09-07\") time <- c(\"00:12:21\", \"22:35:05\", \"03:00:15\", \"07:09:00\") create_iso8601(date, time, .format = c(\"y-m-d\", \"H:M:S\")) #> [1] \"2000-01-05T00:12:21\" \"2001-12-25T22:35:05\" \"1980-06-18T03:00:15\" #> [4] \"1979-09-07T07:09:00\" date <- c(\"2000-01-05\", \"2001-12-25\", \"1980-06-18\", \"1979-09-07\") time <- \"00:12:21\" try(create_iso8601(date, time, .format = c(\"y-m-d\", \"H:M:S\"))) #> Error in create_iso8601(date, time, .format = c(\"y-m-d\", \"H:M:S\")) : #> All vectors in `...` must be of the same length. year <- c(\"99\", \"84\", \"00\", \"80\", \"79\", \"1944\", \"1953\") month_and_day <- c(\"jan 1\", \"apr 04\", \"mar 06\", \"jun 18\", \"sep 07\", \"sep 13\", \"sep 14\") hour <- c(\"12\", \"13\", \"05\", \"23\", \"16\", \"16\", \"19\") min <- c(\"0\", \"60\", \"59\", \"42\", \"44\", \"10\", \"13\") create_iso8601(year, month_and_day, hour, min, .format = c(\"y\", \"m d\", \"H\", \"M\")) #> [1] \"1999-01-01T12:00\" \"1984-04-04T13:60\" \"2000-03-06T05:59\" \"1980-06-18T23:42\" #> [5] \"1979-09-07T16:44\" \"1944-09-13T16:10\" \"1953-09-14T19:13\" try(create_iso8601(\"2000-01-05\", \"y-m-d\")) #> Error in create_iso8601(\"2000-01-05\", \"y-m-d\") : #> argument \".format\" is missing, with no default"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/iso_8601.html","id":"format-variations","dir":"Articles","previous_headings":"","what":"Format variations","title":"Converting dates, times or date-times to ISO 8601","text":".format parameter can easily accommodate variations format inputs: Individual components may come different order, adjust format accordingly: individual characters given format taken strictly, e.g. number spaces matters: format can include regular expressions though: default, streak reserved characters treated one provided, formats equivalent:","code":"create_iso8601(\"2000-01-05\", .format = \"y-m-d\") #> [1] \"2000-01-05\" create_iso8601(\"2000 01 05\", .format = \"y m d\") #> [1] \"2000-01-05\" create_iso8601(\"2000/01/05\", .format = \"y/m/d\") #> [1] \"2000-01-05\" create_iso8601(\"2000 01 05\", .format = \"y m d\") #> [1] \"2000-01-05\" create_iso8601(\"05 01 2000\", .format = \"d m y\") #> [1] \"2000-01-05\" create_iso8601(\"01 05, 2000\", .format = \"m d, y\") #> [1] \"2000-01-05\" date <- c(\"2000 01 05\", \"2000 01 05\", \"2000 01 05\", \"2000 01 05\") create_iso8601(date, .format = \"y m d\") #> [1] \"2000-01-05\" NA NA NA create_iso8601(date, .format = \"y m d\") #> [1] NA \"2000-01-05\" NA NA create_iso8601(date, .format = \"y m d\") #> [1] NA NA \"2000-01-05\" NA create_iso8601(date, .format = \"y m d\") #> [1] NA NA NA \"2000-01-05\" create_iso8601(date, .format = \"y\\\\s+m\\\\s+d\") #> [1] \"2000-01-05\" \"2000-01-05\" \"2000-01-05\" \"2000-01-05\" date <- c(\"2000-01-05\", \"2001-12-25\", \"1980-06-18\", \"1979-09-07\") time <- c(\"00:12:21\", \"22:35:05\", \"03:00:15\", \"07:09:00\") create_iso8601(date, time, .format = c(\"y-m-d\", \"H:M:S\")) #> [1] \"2000-01-05T00:12:21\" \"2001-12-25T22:35:05\" \"1980-06-18T03:00:15\" #> [4] \"1979-09-07T07:09:00\" create_iso8601(date, time, .format = c(\"yyyy-mm-dd\", \"HH:MM:SS\")) #> [1] \"2000-01-05T00:12:21\" \"2001-12-25T22:35:05\" \"1980-06-18T03:00:15\" #> [4] \"1979-09-07T07:09:00\" create_iso8601(date, time, .format = c(\"yyyyyyyy-m-dddddd\", \"H:MMMMM:SSSS\")) #> [1] \"2000-01-05T00:12:21\" \"2001-12-25T22:35:05\" \"1980-06-18T03:00:15\" #> [4] \"1979-09-07T07:09:00\""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/iso_8601.html","id":"multiple-alternative-formats","dir":"Articles","previous_headings":"","what":"Multiple alternative formats","title":"Converting dates, times or date-times to ISO 8601","text":"input vector contains values varying formats, single format may adequate encompass variations. situations, ’s advisable list multiple alternative formats. approach ensures format tried sequentially one matches data vector. Consider order supply formats, can significant. multiple formats potentially match, sequence determines format applied first. Note passing alternative formats, .format argument must list whose length matches number inputs.","code":"date <- c(\"2000/01/01\", \"2000-01-02\", \"2000 01 03\", \"2000/01/04\") create_iso8601(date, .format = \"y-m-d\") #> [1] NA \"2000-01-02\" NA NA create_iso8601(date, .format = \"y m d\") #> [1] NA NA \"2000-01-03\" NA create_iso8601(date, .format = \"y/m/d\") #> [1] \"2000-01-01\" NA NA \"2000-01-04\" create_iso8601(date, .format = list(c(\"y-m-d\", \"y m d\", \"y/m/d\"))) #> [1] \"2000-01-01\" \"2000-01-02\" \"2000-01-03\" \"2000-01-04\" create_iso8601(\"07 04 2000\", .format = list(c(\"d m y\", \"m d y\"))) #> [1] \"2000-04-07\" create_iso8601(\"07 04 2000\", .format = list(c(\"m d y\", \"d m y\"))) #> [1] \"2000-07-04\""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/iso_8601.html","id":"parsing-of-date-or-time-components","dir":"Articles","previous_headings":"","what":"Parsing of date or time components","title":"Converting dates, times or date-times to ISO 8601","text":"default, date time components parsed follows: year: either parsed two- four-digit year; month: either numeric month (single two-digit number) English abbreviated month name (e.g. Jan, Jun Dec) regardless case; month day: parsed two-digit numbers; hour minute: parsed single two-digit numbers; second: parsed single two-digit numbers optional fractional part.","code":"# Years: two-digit or four-digit numbers. years <- c(\"0\", \"1\", \"00\", \"01\", \"15\", \"30\", \"50\", \"68\", \"69\", \"80\", \"99\") create_iso8601(years, .format = \"y\") #> [1] NA NA \"2000\" \"2001\" \"2015\" \"2030\" \"2050\" \"2068\" \"1969\" \"1980\" #> [11] \"1999\" # Adjust the point where two-digits years are mapped to 2000's or 1900's. create_iso8601(years, .format = \"y\", .cutoff_2000 = 20L) #> [1] NA NA \"2000\" \"2001\" \"2015\" \"1930\" \"1950\" \"1968\" \"1969\" \"1980\" #> [11] \"1999\" # Both numeric months (two-digit only) and abbreviated months work out of the box months <- c(\"0\", \"00\", \"1\", \"01\", \"Jan\", \"jan\") create_iso8601(months, .format = \"m\") #> [1] NA \"--00\" NA \"--01\" \"--01\" \"--01\" # Month days: single or two-digit numbers, anything else results in NA. create_iso8601(c(\"1\", \"01\", \"001\", \"10\", \"20\", \"31\"), .format = \"d\") #> [1] \"----01\" \"----01\" NA \"----10\" \"----20\" \"----31\" # Hours create_iso8601(c(\"1\", \"01\", \"001\", \"10\", \"20\", \"31\"), .format = \"H\") #> [1] \"-----T01\" \"-----T01\" NA \"-----T10\" \"-----T20\" \"-----T31\" # Minutes create_iso8601(c(\"1\", \"01\", \"001\", \"10\", \"20\", \"60\"), .format = \"M\") #> [1] \"-----T-:01\" \"-----T-:01\" NA \"-----T-:10\" \"-----T-:20\" #> [6] \"-----T-:60\" # Seconds create_iso8601(c(\"1\", \"01\", \"23.04\", \"001\", \"10\", \"20\", \"60\"), .format = \"S\") #> [1] \"-----T-:-:01\" \"-----T-:-:01\" \"-----T-:-:23.04\" NA #> [5] \"-----T-:-:10\" \"-----T-:-:20\" \"-----T-:-:60\""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/iso_8601.html","id":"allowing-alternative-date-or-time-values","dir":"Articles","previous_headings":"","what":"Allowing alternative date or time values","title":"Converting dates, times or date-times to ISO 8601","text":"date time component values include special values, e.g. values encoding missing values, can indicate values possible alternatives parsing tolerate ; use .na argument: case achieve result using regexps:","code":"create_iso8601(\"U DEC 2019 14:00\", .format = \"d m y H:M\") #> [1] NA create_iso8601(\"U DEC 2019 14:00\", .format = \"d m y H:M\", .na = \"U\") #> [1] \"2019-12--T14:00\" create_iso8601(\"U UNK 2019 14:00\", .format = \"d m y H:M\") #> [1] NA create_iso8601(\"U UNK 2019 14:00\", .format = \"d m y H:M\", .na = c(\"U\", \"UNK\")) #> [1] \"2019----T14:00\" create_iso8601(\"U UNK 2019 14:00\", .format = \"(d|U) (m|UNK) y H:M\") #> [1] \"2019----T14:00\""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/iso_8601.html","id":"changing-reserved-format-characters","dir":"Articles","previous_headings":"","what":"Changing reserved format characters","title":"Converting dates, times or date-times to ISO 8601","text":"might cases reserved characters — \"y\", \"m\", \"d\", \"H\", \"M\", \"S\" — might get way specifying adequate format. example, might tempted use format \"HHMM\" try parse time \"14H00M\". assume first “H” codes parsing hour, second “H” literal “H” , actually, \"HH\" taken mean parsing hours, \"MM\" parse minutes. can use function fmt_cmp() specify alternative format regexps format, replacing default characters. next example, reassign new format strings hour minute components, thus freeing \"H\" \"M\" patterns interpreted hours minutes, taken literally: Note need make sure format component regexps mutually exclusive, .e. don’t overlapping matches; otherwise create_iso8601() fail error. next example months minutes represented \"m\" format resulting ambiguous format specification.","code":"create_iso8601(\"14H00M\", .format = \"HHMM\") #> [1] NA create_iso8601(\"14H00M\", .format = \"xHwM\", .fmt_c = fmt_cmp(hour = \"x\", min = \"w\")) #> [1] \"-----T14:00\" fmt_cmp(hour = \"h\", min = \"m\") #> $sec #> [1] \"S+\" #> #> $min #> [1] \"m\" #> #> $hour #> [1] \"h\" #> #> $mday #> [1] \"d+\" #> #> $mon #> [1] \"m+\" #> #> $year #> [1] \"y+\" #> #> attr(,\"class\") #> [1] \"fmt_c\" try(create_iso8601(\"14H00M\", .format = \"hHmM\", .fmt_c = fmt_cmp(hour = \"h\", min = \"m\"))) #> Error in purrr::map2(dots, .format, ~parse_dttm(dttm = .x, fmt = .y, na = .na, : #> ℹ In index: 1. #> Caused by error in `purrr::map()` at sdtm.oak/R/dtc_parse_dttm.R:78:3: #> ℹ In index: 1. #> Caused by error in `parse_dttm_fmt()` at sdtm.oak/R/parse_dttm_fmt.R:387:3: #> ! Patterns in `fmt_c` have overlapping matches."},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/study_sdtm_spec.html","id":"standards-metadata","dir":"Articles","previous_headings":"","what":"Standards Metadata","title":"All about Metadata","text":"standards metadata used {sdtm.oak} sourced CDISC Library sponsor MDR form documentation standards maintained. metadata provides information following: relationship Data Collection Standards (eCRF & eDT), SDTM mapping, Controlled Terminology Machine-readable standard SDTM mappings Algorithms associated metadata required SDTM automation standards study. upcoming releases {sdtm.oak}, effectively utilize standards metadata customize meet study requirements.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/study_sdtm_spec.html","id":"study-definition-metadata","dir":"Articles","previous_headings":"","what":"Study Definition Metadata","title":"All about Metadata","text":"Study Definition Metadata also referred Study Metadata. Study Definition Metadata provides information eCRF eDT data collected study. eCRF Metadata eCRF Design Metadata fetched EDC system. Metadata includes Forms Metadata: Identifier, eCRF label, Repeating format properties eCRF. Fields Metadata: Identifier, question label, datatype, properties data collection fields study. Data Dictionaries: Identifier controlled terms collected source. Visits: Name visits defined EDC. eDT Metadata eDT Metadata blueprint metadata describes data collected part external data transfer (clinical sites sponsor). includes Dataset name, label, repeating properties, etc. Variable name, datatype, label associated codelist, etc.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/study_sdtm_spec.html","id":"study-sdtm-mappings-metadata-specifications","dir":"Articles","previous_headings":"","what":"Study SDTM Mappings Metadata (specifications)","title":"All about Metadata","text":"Study SDTM mappings metadata study SDTM specification. develop SDTM domains, {sdtm.oak} requires user prepare Study SDTM mappings metadata. Unlike conventional SDTM specification, includes one tab per domain defining target (SDTM domain, Variables) source (raw dataset, raw variables) SDTM mappings, SDTM spec {sdtm.oak} defines source--target relationship. source, SDTM mapping, algorithms, associated metadata defined. table presents columns SDTM mapping specification explanation.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Rammprasad Ganapathy. Author, maintainer. Adam Forys. Author. Edgar Manukyan. Author. Rosemary Li. Author. Preetesh Parikh. Author. Lisa Houterloot. Author. Yogesh Gupta. Author. Omar Garcia. Author. Ramiro Magno. Author. Kamil Sijko. Author. Shiyu Chen. Author. Pattern Institute. Copyright holder, funder. F. Hoffmann-La Roche AG. Copyright holder, funder. Pfizer Inc. Copyright holder, funder. Transition Technologies Science. Copyright holder, funder.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Ganapathy R, Forys , Manukyan E, Li R, Parikh P, Houterloot L, Gupta Y, Garcia O, Magno R, Sijko K, Chen S (2024). sdtm.oak: SDTM Data Transformation Engine. R package version 0.0.0.9005, https://github.com/pharmaverse/sdtm.oak, https://pharmaverse.github.io/sdtm.oak/.","code":"@Manual{, title = {sdtm.oak: SDTM Data Transformation Engine}, author = {Rammprasad Ganapathy and Adam Forys and Edgar Manukyan and Rosemary Li and Preetesh Parikh and Lisa Houterloot and Yogesh Gupta and Omar Garcia and Ramiro Magno and Kamil Sijko and Shiyu Chen}, year = {2024}, note = {R package version 0.0.0.9005, https://github.com/pharmaverse/sdtm.oak}, url = {https://pharmaverse.github.io/sdtm.oak/}, }"},{"path":"https://pharmaverse.github.io/sdtm.oak/index.html","id":"sdtmoak-","dir":"","previous_headings":"","what":"SDTM Data Transformation Engine","title":"SDTM Data Transformation Engine","text":"EDC Data Standard agnostic solution enables pharmaceutical programming community develop SDTM datasets R. reusable algorithms concept sdtm.oak provides framework modular programming also can automate SDTM creation based standard SDTM spec.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"SDTM Data Transformation Engine","text":"can install development version sdtm.oak GitHub :","code":"# install.packages(\"remotes\") remotes::install_github(\"pharmaverse/sdtm.oak\")"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/add_problems.html","id":null,"dir":"Reference","previous_headings":"","what":"Add ISO 8601 parsing problems — add_problems","title":"Add ISO 8601 parsing problems — add_problems","text":"add_problems() annotates returned value create_iso8601() possible parsing problems. annotation consists tibble problems, one row parsing failure (see Details section).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/add_problems.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add ISO 8601 parsing problems — add_problems","text":"","code":"add_problems(x, is_problem, dtc)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/add_problems.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add ISO 8601 parsing problems — add_problems","text":"x character vector date-times ISO 8601 format; typically, output format_iso8601(). is_problem logical indicating date/time inputs associated parsing failures. dtc list character vectors dates, times date-times' components. Typically, parameter takes value passed ... create_iso8601() call.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/add_problems.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add ISO 8601 parsing problems — add_problems","text":"Either x without modification, parsing problems exist, annotated x, meaning problems attribute holds parsing issues (see Details section).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/add_problems.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add ISO 8601 parsing problems — add_problems","text":"function annotates input x, vector date-times ISO 8601 format, creating attribute named problems. attribute's value tibble parsing problems. problematic date/times indicated logical vector passed argument is_problem. attribute problems returned value contain first column named ..indicates date/time index problematic date/time x, many extra columns inputs (passed dtc). dtc named, names used name extra columns, otherwise get named sequentially like ..var1, ..var2, etc..","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/any_problems.html","id":null,"dir":"Reference","previous_headings":"","what":"Detect problems with the parsing of date/times — any_problems","title":"Detect problems with the parsing of date/times — any_problems","text":"any_problems() takes list capture matrices (see parse_dttm()) reports parsing problems means predicate values. FALSE value indicates parsing successful TRUE value parsing failure least one inputs create_iso8601(). Note internal function used context create_iso8601() source code hence capture matrix corresponds one input create_iso8601().","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/any_problems.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Detect problems with the parsing of date/times — any_problems","text":"","code":"any_problems(cap_matrices, .cutoff_2000 = 68L)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/any_problems.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Detect problems with the parsing of date/times — any_problems","text":"cap_matrices list capture matrices sense returned value parse_dttm(). .cutoff_2000 integer value. Two-digit years smaller equal .cutoff_2000 parsed though starting 20, otherwise parsed though starting 19.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/any_problems.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Detect problems with the parsing of date/times — any_problems","text":"logical whose length matches number underlying date/times passed inputs create_iso8601(), .e. whose length matches number rows capture matrices cap_matrices.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_capture_matrix.html","id":null,"dir":"Reference","previous_headings":"","what":"Assert capture matrix — assert_capture_matrix","title":"Assert capture matrix — assert_capture_matrix","text":"assert_capture_matrix() internal helper function aiding checking internal R object contains parsing results returned parse_dttm(): capture matrix. function checks capture matrix matrix contains six columns: year, mon, mday, hour, min sec.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_capture_matrix.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Assert capture matrix — assert_capture_matrix","text":"","code":"assert_capture_matrix(m)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_capture_matrix.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Assert capture matrix — assert_capture_matrix","text":"m character matrix.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_capture_matrix.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Assert capture matrix — assert_capture_matrix","text":"function throws error m either: character matrix; matrix whose columns (least): year, mon, mday, hour, min sec. Otherwise, returns m invisibly.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_clst.html","id":null,"dir":"Reference","previous_headings":"","what":"Assert a codelist code — assert_ct_clst","title":"Assert a codelist code — assert_ct_clst","text":"assert_ct_clst() asserts validity codelist code context controlled terminology specification.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_clst.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Assert a codelist code — assert_ct_clst","text":"","code":"assert_ct_clst(ct_spec, ct_clst, optional = FALSE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_clst.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Assert a codelist code — assert_ct_clst","text":"ct_spec Either data frame encoding controlled terminology data set, NULL. ct_clst string -asserted codelist code, NULL. optional scalar logical, indicating whether ct_clst can NULL .","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_clst.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Assert a codelist code — assert_ct_clst","text":"function throws error ct_clst valid codelist code given controlled terminology data set; otherwise, ct_clst returned invisibly.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_spec.html","id":null,"dir":"Reference","previous_headings":"","what":"Assert a controlled terminology specification — assert_ct_spec","title":"Assert a controlled terminology specification — assert_ct_spec","text":"assert_ct_spec() check whether ct_spec data frame contains variables: codelist_code, collected_value, term_synonyms, term_value. addition, also check data frame empty (rows), whether columns codelist_code term_value contain NA values.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_spec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Assert a controlled terminology specification — assert_ct_spec","text":"","code":"assert_ct_spec(ct_spec, optional = FALSE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_spec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Assert a controlled terminology specification — assert_ct_spec","text":"ct_spec data frame asserted valid controlled terminology data set.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_spec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Assert a controlled terminology specification — assert_ct_spec","text":"function throws error ct_spec valid controlled terminology data set; otherwise, ct_spec returned invisibly.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_dtc_fmt.html","id":null,"dir":"Reference","previous_headings":"","what":"Assert date time character formats — assert_dtc_fmt","title":"Assert date time character formats — assert_dtc_fmt","text":"assert_dtc_fmt() takes character vector date/time formats checks formats supported, meaning checks one formats listed column fmt dtc_formats, failing error otherwise.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_dtc_fmt.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Assert date time character formats — assert_dtc_fmt","text":"","code":"assert_dtc_fmt(fmt)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_dtc_fmt.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Assert date time character formats — assert_dtc_fmt","text":"fmt character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_dtc_format.html","id":null,"dir":"Reference","previous_headings":"","what":"Assert dtc format — assert_dtc_format","title":"Assert dtc format — assert_dtc_format","text":"assert_dtc_format() internal helper function aiding checking .format parameter create_iso8601().","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_dtc_format.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Assert dtc format — assert_dtc_format","text":"","code":"assert_dtc_format(.format)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_dtc_format.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Assert dtc format — assert_dtc_format","text":".format argument create_iso8601()'s .format parameter.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_dtc_format.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Assert dtc format — assert_dtc_format","text":"function throws error .format either: character vector formats permitted assert_dtc_fmt(); list character vectors formats permitted assert_dtc_fmt(). Otherwise, returns .format invisibly.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive an SDTM variable — assign_no_ct","title":"Derive an SDTM variable — assign_no_ct","text":"assign_no_ct() maps variable raw dataset target SDTM variable terminology restrictions. assign_ct() maps variable raw dataset target SDTM variable following controlled terminology recoding.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive an SDTM variable — assign_no_ct","text":"","code":"assign_no_ct( tgt_dat = NULL, tgt_var, raw_dat, raw_var, id_vars = oak_id_vars() ) assign_ct( tgt_dat = NULL, tgt_var, raw_dat, raw_var, ct_spec, ct_clst, id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive an SDTM variable — assign_no_ct","text":"tgt_dat Target dataset: data frame merged raw_dat variables indicated id_vars. parameter optional, see section Value output changes depending argument value. tgt_var target SDTM variable: single string indicating name variable derived. raw_dat raw dataset (dataframe); must include variables passed id_vars raw_var. raw_var raw variable: single string indicating name raw variable raw_dat. id_vars Key variables used join raw dataset (raw_dat) target data set (raw_dat). ct_spec Study controlled terminology specification: dataframe minimal set columns, see ct_spec_vars() details. ct_clst codelist code indicating subset controlled terminology apply derivation.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive an SDTM variable — assign_no_ct","text":"returned data set depends value tgt_dat: target dataset supplied, meaning tgt_dat defaults NULL, returned data set raw_dat, selected variables indicated id_vars, new extra column: derived variable, indicated tgt_var. target dataset provided, merged raw data set raw_dat variables indicated id_vars, new column: derived variable, indicated tgt_var.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Derive an SDTM variable — assign_no_ct","text":"","code":"md1 <- tibble::tibble( oak_id = 1:14, raw_source = \"MD1\", patient_number = 101:114, MDIND = c( \"NAUSEA\", \"NAUSEA\", \"ANEMIA\", \"NAUSEA\", \"PYREXIA\", \"VOMITINGS\", \"DIARHHEA\", \"COLD\", \"FEVER\", \"LEG PAIN\", \"FEVER\", \"COLD\", \"COLD\", \"PAIN\" ) ) assign_no_ct( tgt_var = \"CMINDC\", raw_dat = md1, raw_var = \"MDIND\" ) #> # A tibble: 14 × 4 #> oak_id raw_source patient_number CMINDC #> #> 1 1 MD1 101 NAUSEA #> 2 2 MD1 102 NAUSEA #> 3 3 MD1 103 ANEMIA #> 4 4 MD1 104 NAUSEA #> 5 5 MD1 105 PYREXIA #> 6 6 MD1 106 VOMITINGS #> 7 7 MD1 107 DIARHHEA #> 8 8 MD1 108 COLD #> 9 9 MD1 109 FEVER #> 10 10 MD1 110 LEG PAIN #> 11 11 MD1 111 FEVER #> 12 12 MD1 112 COLD #> 13 13 MD1 113 COLD #> 14 14 MD1 114 PAIN cm_inter <- tibble::tibble( oak_id = 1:14, raw_source = \"MD1\", patient_number = 101:114, CMTRT = c( \"BABY ASPIRIN\", \"CORTISPORIN\", \"ASPIRIN\", \"DIPHENHYDRAMINE HCL\", \"PARCETEMOL\", \"VOMIKIND\", \"ZENFLOX OZ\", \"AMITRYPTYLINE\", \"BENADRYL\", \"DIPHENHYDRAMINE HYDROCHLORIDE\", \"TETRACYCLINE\", \"BENADRYL\", \"SOMINEX\", \"ZQUILL\" ), CMROUTE = c( \"ORAL\", \"ORAL\", NA, \"ORAL\", \"ORAL\", \"ORAL\", \"INTRAMUSCULAR\", \"INTRA-ARTERIAL\", NA, \"NON-STANDARD\", \"RANDOM_VALUE\", \"INTRA-ARTICULAR\", \"TRANSDERMAL\", \"OPHTHALMIC\" ) ) # Controlled terminology specification (ct_spec <- read_ct_spec_example(\"ct-01-cm\")) #> # A tibble: 33 × 8 #> codelist_code term_code CodedData term_value collected_value #> #> 1 C71113 C25473 QD QD QD (Every Day) #> 2 C71113 C64496 BID BID BID (Twice a Day) #> 3 C71113 C64499 PRN PRN PRN (As Needed) #> 4 C71113 C64516 Q2H Q2H Q2H (Every 2 Hours) #> 5 C71113 C64530 QID QID QID (4 Times a Day) #> 6 C66726 C25158 CAPSULE CAPSULE Capsule #> 7 C66726 C25394 PILL PILL Pill #> 8 C66726 C29167 LOTION LOTION Lotion #> 9 C66726 C42887 AEROSOL AEROSOL Aerosol #> 10 C66726 C42944 INHALANT INHALANT Inhalant #> # ℹ 23 more rows #> # ℹ 3 more variables: term_preferred_term , term_synonyms , #> # raw_codelist assign_ct( tgt_dat = cm_inter, tgt_var = \"CMINDC\", raw_dat = md1, raw_var = \"MDIND\", ct_spec = ct_spec, ct_clst = \"C66729\" ) #> # A tibble: 14 × 6 #> oak_id raw_source patient_number CMTRT CMROUTE CMINDC #> #> 1 1 MD1 101 BABY ASPIRIN ORAL NAUSEA #> 2 2 MD1 102 CORTISPORIN ORAL NAUSEA #> 3 3 MD1 103 ASPIRIN NA ANEMIA #> 4 4 MD1 104 DIPHENHYDRAMINE HCL ORAL NAUSEA #> 5 5 MD1 105 PARCETEMOL ORAL PYREX… #> 6 6 MD1 106 VOMIKIND ORAL VOMIT… #> 7 7 MD1 107 ZENFLOX OZ INTRAM… DIARH… #> 8 8 MD1 108 AMITRYPTYLINE INTRA-… COLD #> 9 9 MD1 109 BENADRYL NA FEVER #> 10 10 MD1 110 DIPHENHYDRAMINE HYDROCHLORIDE NON-ST… LEG P… #> 11 11 MD1 111 TETRACYCLINE RANDOM… FEVER #> 12 12 MD1 112 BENADRYL INTRA-… COLD #> 13 13 MD1 113 SOMINEX TRANSD… COLD #> 14 14 MD1 114 ZQUILL OPHTHA… PAIN"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign_datetime.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive an ISO8601 date-time variable — assign_datetime","title":"Derive an ISO8601 date-time variable — assign_datetime","text":"assign_datetime() maps one variables date/time components raw dataset target SDTM variable following ISO8601 format.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign_datetime.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive an ISO8601 date-time variable — assign_datetime","text":"","code":"assign_datetime( tgt_dat = NULL, tgt_var, raw_dat, raw_var, raw_fmt, raw_unk = c(\"UN\", \"UNK\"), id_vars = oak_id_vars(), .warn = TRUE )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign_datetime.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive an ISO8601 date-time variable — assign_datetime","text":"tgt_dat Target dataset: data frame merged raw_dat variables indicated id_vars. parameter optional, see section Value output changes depending argument value. tgt_var target SDTM variable: single string indicating name variable derived. raw_dat raw dataset (dataframe); must include variables passed id_vars raw_var. raw_var raw variable(s): character vector indicating name(s) raw variable(s) raw_dat date time components parsed ISO8601 format variable tgt_var. raw_fmt date/time parsing format. Either character vector list character vectors. character vector passed element taken parsing format variable indicated raw_var. list provided, element must character vector formats. first vector formats used parsing first variable raw_var, . raw_unk character vector string literals regarded missing values parsing. id_vars Key variables used join raw dataset (raw_dat) target data set (tgt_dat). .warn Whether warn parsing failures.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign_datetime.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive an ISO8601 date-time variable — assign_datetime","text":"returned data set depends value tgt_dat: target dataset supplied, meaning tgt_dat defaults NULL, returned data set raw_dat, selected variables indicated id_vars, new extra column: derived variable, indicated tgt_var. target dataset provided, merged raw data set raw_dat variables indicated id_vars, new column: derived variable, indicated tgt_var.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign_datetime.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Derive an ISO8601 date-time variable — assign_datetime","text":"","code":"# `md1`: an example raw data set. md1 <- tibble::tribble( ~oak_id, ~raw_source, ~patient_number, ~MDBDR, ~MDEDR, ~MDETM, 1L, \"MD1\", 375, NA, NA, NA, 2L, \"MD1\", 375, \"15-Sep-20\", NA, NA, 3L, \"MD1\", 376, \"17-Feb-21\", \"17-Feb-21\", NA, 4L, \"MD1\", 377, \"4-Oct-20\", NA, NA, 5L, \"MD1\", 377, \"20-Jan-20\", \"20-Jan-20\", \"10:00:00\", 6L, \"MD1\", 377, \"UN-UNK-2019\", \"UN-UNK-2019\", NA, 7L, \"MD1\", 377, \"20-UNK-2019\", \"20-UNK-2019\", NA, 8L, \"MD1\", 378, \"UN-UNK-2020\", \"UN-UNK-2020\", NA, 9L, \"MD1\", 378, \"26-Jan-20\", \"26-Jan-20\", \"07:00:00\", 10L, \"MD1\", 378, \"28-Jan-20\", \"1-Feb-20\", NA, 11L, \"MD1\", 378, \"12-Feb-20\", \"18-Feb-20\", NA, 12L, \"MD1\", 379, \"10-UNK-2020\", \"20-UNK-2020\", NA, 13L, \"MD1\", 379, NA, NA, NA, 14L, \"MD1\", 379, NA, \"17-Feb-20\", NA ) # Using the raw data set `md1`, derive the variable CMSTDTC from MDBDR using # the parsing format (`raw_fmt`) `\"d-m-y\"` (day-month-year), while allowing # for the presence of special date component values (e.g. `\"UN\"` or `\"UNK\"`), # indicating that these values are missing/unknown (unk). cm1 <- assign_datetime( tgt_var = \"CMSTDTC\", raw_dat = md1, raw_var = \"MDBDR\", raw_fmt = \"d-m-y\", raw_unk = c(\"UN\", \"UNK\") ) cm1 #> # A tibble: 14 × 4 #> oak_id raw_source patient_number CMSTDTC #> #> 1 1 MD1 375 NA #> 2 2 MD1 375 2020-09-15 #> 3 3 MD1 376 2021-02-17 #> 4 4 MD1 377 2020-10-04 #> 5 5 MD1 377 2020-01-20 #> 6 6 MD1 377 2019 #> 7 7 MD1 377 2019---20 #> 8 8 MD1 378 2020 #> 9 9 MD1 378 2020-01-26 #> 10 10 MD1 378 2020-01-28 #> 11 11 MD1 378 2020-02-12 #> 12 12 MD1 379 2020---10 #> 13 13 MD1 379 NA #> 14 14 MD1 379 NA # Inspect parsing failures associated with derivation of CMSTDTC. problems(cm1$CMSTDTC) #> # A tibble: 3 × 2 #> ..i MDBDR #> #> 1 1 NA #> 2 13 NA #> 3 14 NA # `cm_inter`: an example target data set. cm_inter <- tibble::tibble( oak_id = 1L:14L, raw_source = \"MD1\", patient_number = c( 375, 375, 376, 377, 377, 377, 377, 378, 378, 378, 378, 379, 379, 379 ), CMTRT = c( \"BABY ASPIRIN\", \"CORTISPORIN\", \"ASPIRIN\", \"DIPHENHYDRAMINE HCL\", \"PARCETEMOL\", \"VOMIKIND\", \"ZENFLOX OZ\", \"AMITRYPTYLINE\", \"BENADRYL\", \"DIPHENHYDRAMINE HYDROCHLORIDE\", \"TETRACYCLINE\", \"BENADRYL\", \"SOMINEX\", \"ZQUILL\" ), CMINDC = c( \"NA\", \"NAUSEA\", \"ANEMIA\", \"NAUSEA\", \"PYREXIA\", \"VOMITINGS\", \"DIARHHEA\", \"COLD\", \"FEVER\", \"LEG PAIN\", \"FEVER\", \"COLD\", \"COLD\", \"PAIN\" ) ) # Same derivation as above but now involving the merging with the target # data set `cm_inter`. cm2 <- assign_datetime( tgt_dat = cm_inter, tgt_var = \"CMSTDTC\", raw_dat = md1, raw_var = \"MDBDR\", raw_fmt = \"d-m-y\" ) cm2 #> # A tibble: 14 × 6 #> oak_id raw_source patient_number CMTRT CMINDC CMSTDTC #> #> 1 1 MD1 375 BABY ASPIRIN NA NA … #> 2 2 MD1 375 CORTISPORIN NAUSEA 2020-0… #> 3 3 MD1 376 ASPIRIN ANEMIA 2021-0… #> 4 4 MD1 377 DIPHENHYDRAMINE HCL NAUSEA 2020-1… #> 5 5 MD1 377 PARCETEMOL PYREX… 2020-0… #> 6 6 MD1 377 VOMIKIND VOMIT… 2019 … #> 7 7 MD1 377 ZENFLOX OZ DIARH… 2019--… #> 8 8 MD1 378 AMITRYPTYLINE COLD 2020 … #> 9 9 MD1 378 BENADRYL FEVER 2020-0… #> 10 10 MD1 378 DIPHENHYDRAMINE HYDROCHLORIDE LEG P… 2020-0… #> 11 11 MD1 378 TETRACYCLINE FEVER 2020-0… #> 12 12 MD1 379 BENADRYL COLD 2020--… #> 13 13 MD1 379 SOMINEX COLD NA … #> 14 14 MD1 379 ZQUILL PAIN NA … # Inspect parsing failures associated with derivation of CMSTDTC. problems(cm2$CMSTDTC) #> # A tibble: 3 × 2 #> ..i MDBDR #> #> 1 1 NA #> 2 13 NA #> 3 14 NA # Derive CMSTDTC using both MDEDR and MDETM variables. # Note that the format `\"d-m-y\"` is used for parsing MDEDR and `\"H:M:S\"` for # MDETM (correspondence is by positional matching). cm3 <- assign_datetime( tgt_var = \"CMSTDTC\", raw_dat = md1, raw_var = c(\"MDEDR\", \"MDETM\"), raw_fmt = c(\"d-m-y\", \"H:M:S\"), raw_unk = c(\"UN\", \"UNK\") ) cm3 #> # A tibble: 14 × 4 #> oak_id raw_source patient_number CMSTDTC #> #> 1 1 MD1 375 NA #> 2 2 MD1 375 NA #> 3 3 MD1 376 2021-02-17 #> 4 4 MD1 377 NA #> 5 5 MD1 377 2020-01-20T10:00:00 #> 6 6 MD1 377 2019 #> 7 7 MD1 377 2019---20 #> 8 8 MD1 378 2020 #> 9 9 MD1 378 2020-01-26T07:00:00 #> 10 10 MD1 378 2020-02-01 #> 11 11 MD1 378 2020-02-18 #> 12 12 MD1 379 2020---20 #> 13 13 MD1 379 NA #> 14 14 MD1 379 2020-02-17 # Inspect parsing failures associated with derivation of CMSTDTC. problems(cm3$CMSTDTC) #> # A tibble: 12 × 3 #> ..i MDEDR MDETM #> #> 1 1 NA NA #> 2 2 NA NA #> 3 3 17-Feb-21 NA #> 4 4 NA NA #> 5 6 UN-UNK-2019 NA #> 6 7 20-UNK-2019 NA #> 7 8 UN-UNK-2020 NA #> 8 10 1-Feb-20 NA #> 9 11 18-Feb-20 NA #> 10 12 20-UNK-2020 NA #> 11 13 NA NA #> 12 14 17-Feb-20 NA"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/clear_cache.html","id":null,"dir":"Reference","previous_headings":"","what":"Clear {sdtm.oak} cache of memoised functions — clear_cache","title":"Clear {sdtm.oak} cache of memoised functions — clear_cache","text":"{sdtm.oak} functions results cached runtime efficiency. Use function reset cache. Memoised functions: ct_mappings()","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/clear_cache.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Clear {sdtm.oak} cache of memoised functions — clear_cache","text":"","code":"clear_cache()"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/clear_cache.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Clear {sdtm.oak} cache of memoised functions — clear_cache","text":"Returns logical value, indicating whether resetting cache successful (TRUE) (FALSE).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/clear_cache.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Clear {sdtm.oak} cache of memoised functions — clear_cache","text":"","code":"clear_cache() #> [1] TRUE"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/coalesce_capture_matrices.html","id":null,"dir":"Reference","previous_headings":"","what":"Coalesce capture matrices — coalesce_capture_matrices","title":"Coalesce capture matrices — coalesce_capture_matrices","text":"coalesce_capture_matrices() combines several capture matrices one. argument ... capture matrix sense output complete_capture_matrix(), meaning character matrix six columns whose names : year, mon, mday, hour, min sec.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/coalesce_capture_matrices.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Coalesce capture matrices — coalesce_capture_matrices","text":"","code":"coalesce_capture_matrices(...)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/coalesce_capture_matrices.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coalesce capture matrices — coalesce_capture_matrices","text":"... sequence capture matrices.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/coalesce_capture_matrices.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coalesce capture matrices — coalesce_capture_matrices","text":"single capture matrix whose values coalesced sense coalesce().","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/complete_capture_matrix.html","id":null,"dir":"Reference","previous_headings":"","what":"Complete a capture matrix — complete_capture_matrix","title":"Complete a capture matrix — complete_capture_matrix","text":"complete_capture_matrix() completes missing, , columns capture matrix.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/complete_capture_matrix.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Complete a capture matrix — complete_capture_matrix","text":"","code":"complete_capture_matrix(m)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/complete_capture_matrix.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Complete a capture matrix — complete_capture_matrix","text":"m character matrix might missing one following columns: year, mon, mday, hour, min sec.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/complete_capture_matrix.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Complete a capture matrix — complete_capture_matrix","text":"character matrix contains columns year, mon, mday, hour, min sec. existing columns dropped.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/condition_add.html","id":null,"dir":"Reference","previous_headings":"","what":"Add filtering tags to a data set — condition_add","title":"Add filtering tags to a data set — condition_add","text":"condition_add() tags records data set, indicating rows match specified conditions, resulting conditioned data frame. Learn integrate conditioned data frames SDTM domain derivation vignette(\"cnd_df\").","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/condition_add.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add filtering tags to a data set — condition_add","text":"","code":"condition_add(dat, ..., .na = NA, .dat2 = rlang::env())"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/condition_add.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add filtering tags to a data set — condition_add","text":"dat data frame. ... Conditions filter data frame. .na Return value used conditions evaluate NA. .dat2 optional environment look variables involved logical expression passed .... data frame list can also passed coerced environment internally.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/condition_add.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add filtering tags to a data set — condition_add","text":"conditioned data frame, meaning tibble additional class cnd_df logical vector attribute indicating matching rows.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/condition_add.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add filtering tags to a data set — condition_add","text":"","code":"(df <- tibble::tibble(x = 1L:3L, y = letters[x])) #> # A tibble: 3 × 2 #> x y #> #> 1 1 a #> 2 2 b #> 3 3 c # Mark rows for which `x` greater than `1` (cnd_df <- condition_add(dat = df, x > 1L)) #> # A tibble: 3 × 2 #> # Cond. tbl: 2/1/0 #> x y #> #> 1 F 1 a #> 2 T 2 b #> 3 T 3 c"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/contains_oak_id_vars.html","id":null,"dir":"Reference","previous_headings":"","what":"Does a vector contain the raw dataset key variables? — contains_oak_id_vars","title":"Does a vector contain the raw dataset key variables? — contains_oak_id_vars","text":"contains_oak_id_vars() evaluates whether character vector x contains raw dataset key variable names, .e. called Oak identifier variables --- defined return value oak_id_vars().","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/contains_oak_id_vars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Does a vector contain the raw dataset key variables? — contains_oak_id_vars","text":"","code":"contains_oak_id_vars(x)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/contains_oak_id_vars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Does a vector contain the raw dataset key variables? — contains_oak_id_vars","text":"x character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/contains_oak_id_vars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Does a vector contain the raw dataset key variables? — contains_oak_id_vars","text":"logical scalar value.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/create_iso8601.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert date or time collected values to ISO 8601 — create_iso8601","title":"Convert date or time collected values to ISO 8601 — create_iso8601","text":"create_iso8601() converts vectors dates, times date-times ISO 8601 format. Learn vignette(\"iso_8601\").","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/create_iso8601.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert date or time collected values to ISO 8601 — create_iso8601","text":"","code":"create_iso8601( ..., .format, .fmt_c = fmt_cmp(), .na = NULL, .cutoff_2000 = 68L, .check_format = FALSE, .warn = TRUE )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/create_iso8601.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert date or time collected values to ISO 8601 — create_iso8601","text":"... Character vectors dates, times date-times' components. .format Parsing format(s). Either character vector list character vectors. character vector passed element taken parsing format vector passed .... list provided, element must character vector formats. first vector formats used parsing first vector passed ..., . .fmt_c list regexps use parsing .format. Use fmt_cmp() create object pass argument parameter. .na character vector string literals regarded missing values parsing. .cutoff_2000 integer value. Two-digit years smaller equal .cutoff_2000 parsed though starting 20, otherwise parsed though starting 19. .check_format Whether check formats passed .format, meaning check selection validated formats dtc_formats; permissible interpretation formats. .warn Whether warn parsing failures.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/create_iso8601.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convert date or time collected values to ISO 8601 — create_iso8601","text":"","code":"# Converting dates create_iso8601(c(\"2020-01-01\", \"20200102\"), .format = \"y-m-d\") #> [1] \"2020-01-01\" NA create_iso8601(c(\"2020-01-01\", \"20200102\"), .format = \"ymd\") #> [1] NA \"2020-01-02\" create_iso8601(c(\"2020-01-01\", \"20200102\"), .format = list(c(\"y-m-d\", \"ymd\"))) #> [1] \"2020-01-01\" \"2020-01-02\" # Two-digit years are supported create_iso8601(c(\"20-01-01\", \"200101\"), .format = list(c(\"y-m-d\", \"ymd\"))) #> [1] \"2020-01-01\" \"2020-01-01\" # `.cutoff_2000` sets the cutoff for two-digit to four-digit year conversion # Default is at 68. create_iso8601(c(\"67-01-01\", \"68-01-01\", \"69-01-01\"), .format = \"y-m-d\") #> [1] \"2067-01-01\" \"2068-01-01\" \"1969-01-01\" # Change it to 80. create_iso8601(c(\"79-01-01\", \"80-01-01\", \"81-01-01\"), .format = \"y-m-d\", .cutoff_2000 = 80) #> [1] \"2079-01-01\" \"2080-01-01\" \"1981-01-01\" # Converting times create_iso8601(\"15:10\", .format = \"HH:MM\") #> [1] \"-----T15:10\" create_iso8601(\"2:10\", .format = \"HH:MM\") #> [1] \"-----T02:10\" create_iso8601(\"2:1\", .format = \"HH:MM\") #> [1] \"-----T02:01\" create_iso8601(\"02:01:56\", .format = \"HH:MM:SS\") #> [1] \"-----T02:01:56\" create_iso8601(\"020156.5\", .format = \"HHMMSS\") #> [1] \"-----T02:01:56.5\" # Converting date-times create_iso8601(\"12 NOV 202015:15\", .format = \"dd mmm yyyyHH:MM\") #> [1] \"2020-11-12T15:15\" # Indicate allowed missing values to make the parsing pass create_iso8601(\"U DEC 201914:00\", .format = \"dd mmm yyyyHH:MM\") #> [1] NA create_iso8601(\"U DEC 201914:00\", .format = \"dd mmm yyyyHH:MM\", .na = \"U\") #> [1] \"2019-12--T14:00\" create_iso8601(\"NOV 2020\", .format = \"m y\") #> [1] \"2020-11\" create_iso8601(c(\"MAR 2019\", \"MaR 2020\", \"mar 2021\"), .format = \"m y\") #> [1] \"2019-03\" \"2020-03\" \"2021-03\" create_iso8601(\"2019-04-041045-\", .format = \"yyyy-mm-ddHHMM-\") #> [1] \"2019-04-04T10:45\" create_iso8601(\"20200507null\", .format = \"ymd(HH:MM:SS)\") #> [1] NA create_iso8601(\"20200507null\", .format = \"ymd((HH:MM:SS)|null)\") #> [1] \"2020-05-07\" # Fractional seconds create_iso8601(\"2019-120602:20:13.1230001\", .format = \"y-mdH:M:S\") #> [1] \"2019-12-06T02:20:13.1230001\" # Use different reserved characters in the format specification # Here we change \"H\" to \"x\" and \"M\" to \"w\", for hour and minute, respectively. create_iso8601(\"14H00M\", .format = \"HHMM\") #> [1] NA create_iso8601(\"14H00M\", .format = \"xHwM\", .fmt_c = fmt_cmp(hour = \"x\", min = \"w\")) #> [1] \"-----T14:00\" # Alternative formats with unknown values datetimes <- c(\"UN UNK 201914:00\", \"UN JAN 2021\") format <- list(c(\"dd mmm yyyy\", \"dd mmm yyyyHH:MM\")) create_iso8601(datetimes, .format = format, .na = c(\"UN\", \"UNK\")) #> [1] \"2019----T14:00\" \"2021-01\" # Dates and times may come in many format variations fmt <- \"dd MMM yyyy HH nn ss\" fmt_cmp <- fmt_cmp(mon = \"MMM\", min = \"nn\", sec = \"ss\") create_iso8601(\"05 feb 1985 12 55 02\", .format = fmt, .fmt_c = fmt_cmp) #> [1] \"1985-02-05T12:55:02\""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_map.html","id":null,"dir":"Reference","previous_headings":"","what":"Recode according to controlled terminology — ct_map","title":"Recode according to controlled terminology — ct_map","text":"ct_map() recodes vector following controlled terminology.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_map.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Recode according to controlled terminology — ct_map","text":"","code":"ct_map( x, ct_spec = NULL, ct_clst = NULL, from = ct_spec_vars(\"from\"), to = ct_spec_vars(\"to\") )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_map.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Recode according to controlled terminology — ct_map","text":"x character vector terms recoded following controlled terminology. ct_spec tibble providing controlled terminology specification. ct_clst character vector indicating set possible controlled terminology codelists codes used recoding. default (NULL) codelists available ct_spec used. character vector column names indicating variables containing values matched terminology recoding. single string indicating column whose values recoded .","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_map.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Recode according to controlled terminology — ct_map","text":"character vector terminology recoded values x. match found controlled terminology spec provided ct_spec, x values returned uppercase. ct_spec provided x returned unchanged.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_map.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Recode according to controlled terminology — ct_map","text":"","code":"# A few example terms. terms <- c( \"/day\", \"Yes\", \"Unknown\", \"Prior\", \"Every 2 hours\", \"Percentage\", \"International Unit\" ) # Load a controlled terminology example (ct_spec <- read_ct_spec_example(\"ct-01-cm\")) #> # A tibble: 33 × 8 #> codelist_code term_code CodedData term_value collected_value #> #> 1 C71113 C25473 QD QD QD (Every Day) #> 2 C71113 C64496 BID BID BID (Twice a Day) #> 3 C71113 C64499 PRN PRN PRN (As Needed) #> 4 C71113 C64516 Q2H Q2H Q2H (Every 2 Hours) #> 5 C71113 C64530 QID QID QID (4 Times a Day) #> 6 C66726 C25158 CAPSULE CAPSULE Capsule #> 7 C66726 C25394 PILL PILL Pill #> 8 C66726 C29167 LOTION LOTION Lotion #> 9 C66726 C42887 AEROSOL AEROSOL Aerosol #> 10 C66726 C42944 INHALANT INHALANT Inhalant #> # ℹ 23 more rows #> # ℹ 3 more variables: term_preferred_term , term_synonyms , #> # raw_codelist # Use all possible matching terms in the controlled terminology. ct_map(x = terms, ct_spec = ct_spec) #> [1] \"QD\" \"Y\" \"UNKNOWN\" \"BEFORE\" \"Q2H\" \"%\" \"IU\" # Note that if the controlled terminology mapping is restricted to a codelist # code, e.g. C71113, then only `\"/day\"` and `\"Every 2 hours\"` get mapped to # `\"QD\"` and `\"Q2H\"`, respectively; remaining terms won't match given the # codelist code restriction, and will be mapped to an uppercase version of # the original terms. ct_map(x = terms, ct_spec = ct_spec, ct_clst = \"C71113\") #> [1] \"QD\" \"YES\" \"UNKNOWN\" #> [4] \"PRIOR\" \"Q2H\" \"PERCENTAGE\" #> [7] \"INTERNATIONAL UNIT\""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_mappings.html","id":null,"dir":"Reference","previous_headings":"","what":"Controlled terminology mappings — ct_mappings","title":"Controlled terminology mappings — ct_mappings","text":"ct_mappings() takes controlled terminology specification returns mappings form tibble long format, .e. recoding values column column values, one mapping per row. resulting mappings unique, .e. values duplicated two columns, first column indicated takes precedence, mapping retained controlled terminology map.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_mappings.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Controlled terminology mappings — ct_mappings","text":"","code":"ct_mappings(ct_spec, from = ct_spec_vars(\"from\"), to = ct_spec_vars(\"to\"))"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_mappings.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Controlled terminology mappings — ct_mappings","text":"ct_spec Controlled terminology specification tibble. row mapped controlled term. Controlled terms expected column indicated to_col. character vector column names indicating variables containing values recoded. single string indicating column whose values recoded .","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_mappings.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Controlled terminology mappings — ct_mappings","text":"tibble two columns, , indicating mapping values, one per row.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_example.html","id":null,"dir":"Reference","previous_headings":"","what":"Find the path to an example controlled terminology file — ct_spec_example","title":"Find the path to an example controlled terminology file — ct_spec_example","text":"ct_spec_example() resolves local path example controlled terminology file.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_example.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Find the path to an example controlled terminology file — ct_spec_example","text":"","code":"ct_spec_example(example)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_example.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Find the path to an example controlled terminology file — ct_spec_example","text":"example string either basename, file name, relative path controlled terminology file bundled {stdm.oak}, see examples.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_example.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Find the path to an example controlled terminology file — ct_spec_example","text":"local path example file example supplied, character vector example file names.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_example.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Find the path to an example controlled terminology file — ct_spec_example","text":"","code":"# Get the local path to controlled terminology example file 01 # Using the basename only: ct_spec_example(\"ct-01-cm\") #> [1] \"/renv/lib/R-4.3/x86_64-pc-linux-gnu/sdtm.oak/ct/ct-01-cm.csv\" # Using the file name: ct_spec_example(\"ct-01-cm.csv\") #> [1] \"/renv/lib/R-4.3/x86_64-pc-linux-gnu/sdtm.oak/ct/ct-01-cm.csv\" # Using the relative path: ct_spec_example(\"ct/ct-01-cm.csv\") #> [1] \"/renv/lib/R-4.3/x86_64-pc-linux-gnu/sdtm.oak/ct/ct-01-cm.csv\" # If no example is provided it returns a vector of possible choices. ct_spec_example() #> [1] \"ct-01-cm.csv\""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_vars.html","id":null,"dir":"Reference","previous_headings":"","what":"Controlled terminology variables — ct_spec_vars","title":"Controlled terminology variables — ct_spec_vars","text":"ct_spec_vars() returns mandatory variables present data set representing controlled terminology. default, returns required variables. subset variables used matching terms needed, request subset variables passing argument value \"\". mapping-variable requested, simply pass \"\". codelist code variable name needed pass \"ct_clst\".","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_vars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Controlled terminology variables — ct_spec_vars","text":"","code":"ct_spec_vars(set = c(\"all\", \"ct_clst\", \"from\", \"to\"))"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_vars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Controlled terminology variables — ct_spec_vars","text":"set scalar character (string), one : \"\" (default), \"ct_clst\", \"\" \"\".","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ctl_new_rowid_pillar.cnd_df.html","id":null,"dir":"Reference","previous_headings":"","what":"Conditioned tibble pillar print method — ctl_new_rowid_pillar.cnd_df","title":"Conditioned tibble pillar print method — ctl_new_rowid_pillar.cnd_df","text":"Conditioned tibble pillar print method","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ctl_new_rowid_pillar.cnd_df.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Conditioned tibble pillar print method — ctl_new_rowid_pillar.cnd_df","text":"","code":"# S3 method for cnd_df ctl_new_rowid_pillar(controller, x, width, ...)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ctl_new_rowid_pillar.cnd_df.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Conditioned tibble pillar print method — ctl_new_rowid_pillar.cnd_df","text":"controller object class \"tbl\" currently printed. x simple (one-dimensional) vector. width available width, can vector multiple tiers. ... dots future extensions must empty.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dataset_oak_vignette.html","id":null,"dir":"Reference","previous_headings":"","what":"Output a Dataset in a Vignette in the sdtm.oak Format — dataset_oak_vignette","title":"Output a Dataset in a Vignette in the sdtm.oak Format — dataset_oak_vignette","text":"Output dataset vignette pre-specified sdtm.oak format.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dataset_oak_vignette.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Output a Dataset in a Vignette in the sdtm.oak Format — dataset_oak_vignette","text":"","code":"dataset_oak_vignette(dataset, display_vars = NULL, filter = NULL)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dataset_oak_vignette.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Output a Dataset in a Vignette in the sdtm.oak Format — dataset_oak_vignette","text":"dataset Dataset output vignette display_vars Variables selected demonstrate outcome mapping Permitted Values: list variables Default NULL display_vars NULL, selected variables visible vignette variables hidden. can made visible clicking theChoose columns display button. filter Filter condition specified condition applied dataset displayed. Permitted Values: condition","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dataset_oak_vignette.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Output a Dataset in a Vignette in the sdtm.oak Format — dataset_oak_vignette","text":"HTML table","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_blfl.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive Baseline Flag or Last Observation Before Exposure Flag — derive_blfl","title":"Derive Baseline Flag or Last Observation Before Exposure Flag — derive_blfl","text":"Derive baseline flag variable (--BLFL) last observation exposure flag (--LOBXFL), observation date/time (--DTC), DM domain reference date/time.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_blfl.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive Baseline Flag or Last Observation Before Exposure Flag — derive_blfl","text":"","code":"derive_blfl( sdtm_in, dm_domain, tgt_var, ref_var, baseline_visits = character(), baseline_timepoints = character() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_blfl.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive Baseline Flag or Last Observation Before Exposure Flag — derive_blfl","text":"sdtm_in Input SDTM domain. dm_domain DM domain reference variable ref_var tgt_var Name variable derived (--BLFL --LOBXFL -- domain). ref_var vector date/time Demographics (DM) dataset, serves point comparison observations study. Common choices reference variable include \"RFSTDTC\" (date/time first study treatment) \"RFXSTDTC\" (date/time first exposure study drug). baseline_visits character vector specifying baseline visits within study. visits identified critical points data collection start study, intervention applied. allows function assign baseline flag --DTC matches reference date. baseline_timepoints character vector timepoints values --TPT specifies specific timepoints baseline visits key assessments measurements taken. allows function assign baseline flag --DTC matches reference date.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_blfl.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive Baseline Flag or Last Observation Before Exposure Flag — derive_blfl","text":"Modified input data frame baseline flag variable --BLFL last observation exposure flag --LOBXFL added.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_blfl.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Derive Baseline Flag or Last Observation Before Exposure Flag — derive_blfl","text":"derivation follows: Remove records result (--ORRES) missing. Also, exclude records results labeled \"ND\" (Data) \"DONE\" --ORRES column, indicate measurement observation completed. Remove records status (--STAT) indicates observation test performed, marked \"DONE\". Divide date time column (--DTC) reference date/time variable (ref_var) separate date time components. Ignore seconds recorded time component, focusing hours minutes calculations. Set partial missing dates NA. Set partial missing times NA. Filter rows domain reference dates equal NA. (Ref X) Filter X rows domain date (--DTC) prior (less ) reference date. (Ref ) Filter X rows domain date (--DTC) equal reference date domain reference times equal NA domain time prior (less ) reference time. (Ref B) Filter X rows domain date (--DTC) equal reference date domain /reference time equal NA : VISIT baseline visits list (exists) xxTPT baseline timepoints list (exists). (Ref C) Combine rows , B, C get data frame pre-reference date observations. Sort rows USUBJID, --STAT, --ORRES. Group USUBJID --TESTCD filter rows maximum value --DTC. Keep oak id variables --TESTCD (unique values). Remove duplicate rows. Assign baseline flag variable, --BLFL, last observation exposure flag (--LOBXFL) variable rows. Join baseline flag onto input dataset based oak id vars","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_blfl.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Derive Baseline Flag or Last Observation Before Exposure Flag — derive_blfl","text":"","code":"dm <- tibble::tribble( ~USUBJID, ~RFSTDTC, ~RFXSTDTC, \"test_study-375\", \"2020-09-28T10:10\", \"2020-09-28T10:10\", \"test_study-376\", \"2020-09-21T11:00\", \"2020-09-21T11:00\", \"test_study-377\", NA, NA, \"test_study-378\", \"2020-01-20T10:00\", \"2020-01-20T10:00\", \"test_study-379\", NA, NA, ) dm #> # A tibble: 5 × 3 #> USUBJID RFSTDTC RFXSTDTC #> #> 1 test_study-375 2020-09-28T10:10 2020-09-28T10:10 #> 2 test_study-376 2020-09-21T11:00 2020-09-21T11:00 #> 3 test_study-377 NA NA #> 4 test_study-378 2020-01-20T10:00 2020-01-20T10:00 #> 5 test_study-379 NA NA sdtm_in <- tibble::tribble( ~DOMAIN, ~oak_id, ~raw_source, ~patient_number, ~USUBJID, ~VSDTC, ~VSTESTCD, ~VSORRES, ~VSSTAT, ~VISIT, \"VS\", 1L, \"VTLS1\", 375L, \"test_study-375\", \"2020-09-01T13:31\", \"DIABP\", \"90\", NA, \"SCREENING\", \"VS\", 2L, \"VTLS1\", 375L, \"test_study-375\", \"2020-10-01T11:20\", \"DIABP\", \"90\", NA, \"SCREENING\", \"VS\", 1L, \"VTLS1\", 375L, \"test_study-375\", \"2020-09-28T10:10\", \"PULSE\", \"ND\", NA, \"SCREENING\", \"VS\", 2L, \"VTLS1\", 375L, \"test_study-375\", \"2020-10-01T13:31\", \"PULSE\", \"85\", NA, \"SCREENING\", \"VS\", 1L, \"VTLS2\", 375L, \"test_study-375\", \"2020-09-28T10:10\", \"SYSBP\", \"120\", NA, \"SCREENING\", \"VS\", 2L, \"VTLS2\", 375L, \"test_study-375\", \"2020-09-28T10:05\", \"SYSBP\", \"120\", NA, \"SCREENING\", \"VS\", 1L, \"VTLS1\", 376L, \"test_study-376\", \"2020-09-20\", \"DIABP\", \"75\", NA, \"SCREENING\", \"VS\", 1L, \"VTLS1\", 376L, \"test_study-376\", \"2020-09-20\", \"PULSE\", NA, \"NOT DONE\", \"SCREENING\", \"VS\", 2L, \"VTLS1\", 376L, \"test_study-376\", \"2020-09-20\", \"PULSE\", \"110\", NA, \"SCREENING\", \"VS\", 2L, \"VTLS1\", 378L, \"test_study-378\", \"2020-01-20T10:00\", \"PULSE\", \"110\", NA, \"SCREENING\", \"VS\", 3L, \"VTLS1\", 378L, \"test_study-378\", \"2020-01-21T11:00\", \"PULSE\", \"105\", NA, \"SCREENING\" ) sdtm_in #> # A tibble: 11 × 10 #> DOMAIN oak_id raw_source patient_number USUBJID VSDTC VSTESTCD VSORRES VSSTAT #> #> 1 VS 1 VTLS1 375 test_s… 2020… DIABP 90 NA #> 2 VS 2 VTLS1 375 test_s… 2020… DIABP 90 NA #> 3 VS 1 VTLS1 375 test_s… 2020… PULSE ND NA #> 4 VS 2 VTLS1 375 test_s… 2020… PULSE 85 NA #> 5 VS 1 VTLS2 375 test_s… 2020… SYSBP 120 NA #> 6 VS 2 VTLS2 375 test_s… 2020… SYSBP 120 NA #> 7 VS 1 VTLS1 376 test_s… 2020… DIABP 75 NA #> 8 VS 1 VTLS1 376 test_s… 2020… PULSE NA NOT D… #> 9 VS 2 VTLS1 376 test_s… 2020… PULSE 110 NA #> 10 VS 2 VTLS1 378 test_s… 2020… PULSE 110 NA #> 11 VS 3 VTLS1 378 test_s… 2020… PULSE 105 NA #> # ℹ 1 more variable: VISIT observed_output <- derive_blfl( sdtm_in = sdtm_in, dm_domain = dm, tgt_var = \"VSLOBXFL\", ref_var = \"RFXSTDTC\", baseline_visits = c(\"SCREENING\") ) observed_output #> # A tibble: 11 × 11 #> DOMAIN oak_id raw_source patient_number USUBJID VSDTC VSTESTCD VSORRES VSSTAT #> #> 1 VS 1 VTLS1 375 test_s… 2020… DIABP 90 NA #> 2 VS 2 VTLS1 375 test_s… 2020… DIABP 90 NA #> 3 VS 1 VTLS1 375 test_s… 2020… PULSE ND NA #> 4 VS 2 VTLS1 375 test_s… 2020… PULSE 85 NA #> 5 VS 1 VTLS2 375 test_s… 2020… SYSBP 120 NA #> 6 VS 2 VTLS2 375 test_s… 2020… SYSBP 120 NA #> 7 VS 1 VTLS1 376 test_s… 2020… DIABP 75 NA #> 8 VS 1 VTLS1 376 test_s… 2020… PULSE NA NOT D… #> 9 VS 2 VTLS1 376 test_s… 2020… PULSE 110 NA #> 10 VS 2 VTLS1 378 test_s… 2020… PULSE 110 NA #> 11 VS 3 VTLS1 378 test_s… 2020… PULSE 105 NA #> # ℹ 2 more variables: VISIT , VSLOBXFL "},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_seq.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive the sequence number (--SEQ) variable — derive_seq","title":"Derive the sequence number (--SEQ) variable — derive_seq","text":"derive_seq() creates new identifier variable: sequence number (--SEQ). function adds newly derived variable tgt_dat, namely sequence number (--SEQ) whose name one provided tgt_var. integer sequence generated uniquely identifies record within domain. Prior derivation tgt_var, data frame tgt_dat sorted according grouping variables indicated rec_vars.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_seq.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive the sequence number (--SEQ) variable — derive_seq","text":"","code":"derive_seq( tgt_dat, tgt_var, rec_vars, sbj_vars = sdtm.oak::sbj_vars(), start_at = 1L )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_seq.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive the sequence number (--SEQ) variable — derive_seq","text":"tgt_dat target dataset, data frame. tgt_var target SDTM variable: single string indicating name sequence number (--SEQ) variable, e.g. \"DSSEQ\". Note supplying name ending \"SEQ\" raise warning. rec_vars character vector record-level identifier variables. sbj_vars character vector subject-level identifier variables. start_at sequence numbering starts value (default 1).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_seq.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive the sequence number (--SEQ) variable — derive_seq","text":"Returns data frame supplied tgt_dat newly derived variable, .e. sequence number (--SEQ), whose name passed tgt_var. variable type integer.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_seq.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Derive the sequence number (--SEQ) variable — derive_seq","text":"","code":"# A VS raw data set example (vs <- read_domain_example(\"vs\")) #> # A tibble: 6 × 7 #> STUDYID DOMAIN USUBJID VSSPID VSTESTCD VSDTC VSTPTNUM #> #> 1 ABC123 VS ABC123-375 /F:VTLS1-D:9795532-R:2 DIABP 2020-09-01… NA #> 2 ABC123 VS ABC123-375 /F:VTLS1-D:9795532-R:2 TEMP 2020-09-01… NA #> 3 ABC123 VS ABC123-375 /F:VTLS2-D:9795533-R:2 DIABP 2020-09-28… 2 #> 4 ABC123 VS ABC123-375 /F:VTLS2-D:9795533-R:2 TEMP 2020-09-28… 2 #> 5 ABC123 VS ABC123-376 /F:VTLS1-D:9795591-R:1 DIABP 2020-09-20 NA #> 6 ABC123 VS ABC123-376 /F:VTLS1-D:9795591-R:1 TEMP 2020-09-20 NA # Derivation of VSSEQ rec_vars <- c(\"STUDYID\", \"USUBJID\", \"VSTESTCD\", \"VSDTC\", \"VSTPTNUM\") derive_seq(tgt_dat = vs, tgt_var = \"VSSEQ\", rec_vars = rec_vars) #> # A tibble: 6 × 8 #> STUDYID DOMAIN USUBJID VSSPID VSTESTCD VSDTC VSTPTNUM VSSEQ #> #> 1 ABC123 VS ABC123-375 /F:VTLS1-D:9795532-R:2 DIABP 2020… NA 1 #> 2 ABC123 VS ABC123-375 /F:VTLS2-D:9795533-R:2 DIABP 2020… 2 2 #> 3 ABC123 VS ABC123-375 /F:VTLS1-D:9795532-R:2 TEMP 2020… NA 3 #> 4 ABC123 VS ABC123-375 /F:VTLS2-D:9795533-R:2 TEMP 2020… 2 4 #> 5 ABC123 VS ABC123-376 /F:VTLS1-D:9795591-R:1 DIABP 2020… NA 1 #> 6 ABC123 VS ABC123-376 /F:VTLS1-D:9795591-R:1 TEMP 2020… NA 2 # An APSC raw data set example (apsc <- read_domain_example(\"apsc\")) #> # A tibble: 6 × 6 #> STUDYID RSUBJID SCTESTCD DOMAIN SREL SCCAT #> #> 1 ABC123 ABC123-210 LVSBJIND APSC FRIEND CAREGIVERSTUDY #> 2 ABC123 ABC123-210 EDULEVEL APSC FRIEND CAREGIVERSTUDY #> 3 ABC123 ABC123-210 TMSPPT APSC FRIEND CAREGIVERSTUDY #> 4 ABC123 ABC123-211 CAREDUR APSC SIBLING CAREGIVERSTUDY #> 5 ABC123 ABC123-211 LVSBJIND APSC SIBLING CAREGIVERSTUDY #> 6 ABC123 ABC123-212 JOBCLAS APSC SPOUSE CAREGIVERSTUDY # Derivation of APSEQ derive_seq( tgt_dat = apsc, tgt_var = \"APSEQ\", rec_vars = c(\"STUDYID\", \"RSUBJID\", \"SCTESTCD\"), sbj_vars = c(\"STUDYID\", \"RSUBJID\") ) #> # A tibble: 6 × 7 #> STUDYID RSUBJID SCTESTCD DOMAIN SREL SCCAT APSEQ #> #> 1 ABC123 ABC123-210 EDULEVEL APSC FRIEND CAREGIVERSTUDY 1 #> 2 ABC123 ABC123-210 LVSBJIND APSC FRIEND CAREGIVERSTUDY 2 #> 3 ABC123 ABC123-210 TMSPPT APSC FRIEND CAREGIVERSTUDY 3 #> 4 ABC123 ABC123-211 CAREDUR APSC SIBLING CAREGIVERSTUDY 1 #> 5 ABC123 ABC123-211 LVSBJIND APSC SIBLING CAREGIVERSTUDY 2 #> 6 ABC123 ABC123-212 JOBCLAS APSC SPOUSE CAREGIVERSTUDY 1"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_study_day.html","id":null,"dir":"Reference","previous_headings":"","what":"derive_study_day performs study day calculation — derive_study_day","title":"derive_study_day performs study day calculation — derive_study_day","text":"function takes input data frame reference data frame (DM domain cases), calculate study day reference date target date. case unexpected conditions like reference date unique patient, reference input dates actual dates, NA returned records.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_study_day.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"derive_study_day performs study day calculation — derive_study_day","text":"","code":"derive_study_day( sdtm_in, dm_domain, tgdt, refdt, study_day_var, merge_key = \"USUBJID\" )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_study_day.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"derive_study_day performs study day calculation — derive_study_day","text":"sdtm_in Input data frame contains target date. dm_domain Reference date frame contains reference date. tgdt Target date sdtm_in used calculate study day. refdt Reference date dm_domain used reference calculate study day. study_day_var New study day variable name output. example, AESTDY AE domain CMSTDY CM domain. merge_key Character represent merging key sdtm_in dm_domain.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_study_day.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"derive_study_day performs study day calculation — derive_study_day","text":"Data frame takes columns sdtm_in new variable represent calculated study day.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_study_day.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"derive_study_day performs study day calculation — derive_study_day","text":"","code":"ae <- data.frame( USUBJID = c(\"study123-123\", \"study123-124\", \"study123-125\"), AESTDTC = c(\"2012-01-01\", \"2012-04-14\", \"2012-04-14\") ) dm <- data.frame( USUBJID = c(\"study123-123\", \"study123-124\", \"study123-125\"), RFSTDTC = c(\"2012-02-01\", \"2012-04-14\", NA) ) ae$AESTDTC <- as.Date(ae$AESTDTC) dm$RFSTDTC <- as.Date(dm$RFSTDTC) derive_study_day(ae, dm, \"AESTDTC\", \"RFSTDTC\", \"AESTDY\") #> USUBJID AESTDTC AESTDY #> 1 study123-123 2012-01-01 -31 #> 2 study123-124 2012-04-14 1 #> 3 study123-125 2012-04-14 NA"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":null,"dir":"Reference","previous_headings":"","what":"Find the path to an example SDTM domain file — domain_example","title":"Find the path to an example SDTM domain file — domain_example","text":"domain_example() resolves local path SDTM domain example file. domain examples files imported pharmaversesdtm. See Details section available datasets.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Find the path to an example SDTM domain file — domain_example","text":"","code":"domain_example(example)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Find the path to an example SDTM domain file — domain_example","text":"See https://cran.r-project.org/package=pharmaversesdtm.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Find the path to an example SDTM domain file — domain_example","text":"example string either basename, file name, relative path SDTM domain example file bundled {stdm.oak}, e.g. \"cm\" (Concomitant Medication) \"ae\" (Adverse Events).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Find the path to an example SDTM domain file — domain_example","text":"local path example file example supplied, character vector example file names.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Find the path to an example SDTM domain file — domain_example","text":"Datasets obtained pharmaversesdtm originally sourced CDISC pilot project constructed ad-hoc admiral team. datasets bundled {sdtm.oak}, thus obviating dependence {pharmaversesdtm}.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":"example-sdtm-domains","dir":"Reference","previous_headings":"","what":"Example SDTM domains","title":"Find the path to an example SDTM domain file — domain_example","text":"\"ae_ophtha\" Ophthalmology Adverse Events Dataset. \"ae\" Adverse Events Dataset-updated. \"ce_vaccine\" Clinical Events Dataset Vaccine Studies. \"cm\" Concomitant Medication Dataset. \"dm_vaccine\" Demographics Dataset Vaccine Studies. \"dm\" Demography Dataset. \"ds\" Disposition Dataset-updated. \"eg\" Electrocardiogram Dataset. \"ex_ophtha\" Ophthalmology Exposure Dataset. \"ex_vaccine\" Exposures Dataset Vaccine Studies. \"ex\" Exposure Dataset. \"face_vaccine\" Findings Clinical Events Dataset Vaccine Studies. \"is_vaccine\" Immunogenicity Specimen Assessments Dataset Vaccine Studies. \"lb\" Laboratory Measurements Dataset. \"mh\" Medical History Dataset-updated. \"oe_ophtha\" Ophthalmology Adverse Events Dataset. \"pc\" Pharmacokinetics Concentrations Dataset. \"pp\" Pharmacokinetics Parameters Dataset. \"qs_ophtha\" Ophthalmology Questionnaire Dataset. \"rs_onco_irecist\" Disease Response Dataset (iRECIST). \"rs_onco\" Disease Response Dataset.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Find the path to an example SDTM domain file — domain_example","text":"","code":"# If no example is provided it returns a vector of possible choices. domain_example() #> [1] \"ae\" \"apsc\" \"cm\" \"vs\" # Get the local path to the Concomitant Medication dataset file. domain_example(\"cm\") #> [1] \"/renv/lib/R-4.3/x86_64-pc-linux-gnu/sdtm.oak/domain/cm.rds\" # Local path to the Adverse Events dataset file. domain_example(\"ae\") #> [1] \"/renv/lib/R-4.3/x86_64-pc-linux-gnu/sdtm.oak/domain/ae.rds\""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dot_pipe.html","id":null,"dir":"Reference","previous_headings":"","what":"Explicit Dot Pipe — %.>%","title":"Explicit Dot Pipe — %.>%","text":"operator pipes object forward function call expression using explicit placement dot (.) placeholder. Unlike magrittr's %>% operator, %.>% automatically place left-hand side (lhs) first argument right-hand side (rhs) call. operator provides simpler alternative use braces magrittr, achieving similar behavior.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dot_pipe.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Explicit Dot Pipe — %.>%","text":"","code":"lhs %.>% rhs"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dot_pipe.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Explicit Dot Pipe — %.>%","text":"lhs value piped forward. rhs function call utilizes dot (.) placeholder specify lhs placed.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dot_pipe.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Explicit Dot Pipe — %.>%","text":"%.>% operator used pipe lhs value rhs function call. Within rhs expression, placeholder . represents position lhs inserted. provides control lhs value appears rhs function call, compared magrittr pipe operator always places lhs first argument rhs. Unlike magrittr's pipe, may require use braces fully control placement lhs nested function calls, %.>% simplifies directly allowing multiple usages dot placeholder without requiring braces. example, following expression using magrittr's pipe braces: can written : without needing additional braces.","code":"library(magrittr) 1:10 %>% { c(min(.), max(.)) } 1:10 %.>% c(min(.), max(.))"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dot_pipe.html","id":"downside","dir":"Reference","previous_headings":"","what":"Downside","title":"Explicit Dot Pipe — %.>%","text":"disadvantage %.>% always need use dot placeholder, even piping first argument right-hand side (rhs).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dot_pipe.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Explicit Dot Pipe — %.>%","text":"","code":"# Equivalent to `subset(head(iris), 1:nrow(head(iris)) %% 2 == 0)` head(iris) %.>% subset(., 1:nrow(.) %% 2 == 0) #> Sepal.Length Sepal.Width Petal.Length Petal.Width Species #> 2 4.9 3.0 1.4 0.2 setosa #> 4 4.6 3.1 1.5 0.2 setosa #> 6 5.4 3.9 1.7 0.4 setosa # Equivalent to `c(min(1:10), max(1:10))` 1:10 %.>% c(min(.), max(.)) #> [1] 1 10"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_datepart.html","id":null,"dir":"Reference","previous_headings":"","what":"Extract date part from ISO8601 date/time variable — dtc_datepart","title":"Extract date part from ISO8601 date/time variable — dtc_datepart","text":"date part extracted ISO8601 date/time variable. default, partial missing dates set NA.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_datepart.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract date part from ISO8601 date/time variable — dtc_datepart","text":"","code":"dtc_datepart(dtc, partial_as_na = TRUE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_datepart.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract date part from ISO8601 date/time variable — dtc_datepart","text":"dtc Character vector containing ISO8601 date/times. partial_as_na Logical TRUE FALSE indicating whether partial dates set NA (default TRUE).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_datepart.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Extract date part from ISO8601 date/time variable — dtc_datepart","text":"Character vector containing ISO8601 dates.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_formats.html","id":null,"dir":"Reference","previous_headings":"","what":"Date/time collection formats — dtc_formats","title":"Date/time collection formats — dtc_formats","text":"Date/time collection formats","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_formats.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Date/time collection formats — dtc_formats","text":"","code":"dtc_formats"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_formats.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Date/time collection formats — dtc_formats","text":"tibble 20 formats three variables: fmt Format string. type Whether date, time date-time. description Description date-time components parsed.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_formats.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Date/time collection formats — dtc_formats","text":"","code":"dtc_formats #> # A tibble: 20 × 3 #> fmt type description #> #> 1 ymd date Parses a date: year, month, and month day. #> 2 y m d date Parses a date: year, month, and month day. #> 3 y-m-d date Parses a date: year, month, and month day. #> 4 dmy date Parses a date: month day, month and year. #> 5 d m y date Parses a date: month day, month and year. #> 6 d-m-y date Parses a date: month day, month and year. #> 7 ym date Parses a date: year and month. #> 8 y m date Parses a date: year and month. #> 9 y-m date Parses a date: year and month. #> 10 my date Parses a date: month and year. #> 11 m y date Parses a date: month and year. #> 12 m-y date Parses a date: month and year. #> 13 HM time Parses a time: hour and minutes. #> 14 HMS time Parses a time: hour, minutes, and seconds. #> 15 H:M time Parses a time: hour and minutes. #> 16 H:M:S time Parses a time: hour, minutes and seconds. #> 17 ymdH:M:S datetime Parses a date-time: year, month, month day, hour, minut… #> 18 ymd H:M:S datetime Parses a date-time: year, month, month day, hour, minut… #> 19 y-m-d H:M:S datetime Parses a date-time: year, month, month day, hour, minut… #> 20 y m d H:M:S datetime Parses a date-time: year, month, month day, hour, minut…"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_timepart.html","id":null,"dir":"Reference","previous_headings":"","what":"Extract time part from ISO 8601 date/time variable — dtc_timepart","title":"Extract time part from ISO 8601 date/time variable — dtc_timepart","text":"time part extracted ISO 8601 date/time variable. default, partial missing times set NA, seconds ignored extracted.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_timepart.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract time part from ISO 8601 date/time variable — dtc_timepart","text":"","code":"dtc_timepart(dtc, partial_as_na = TRUE, ignore_seconds = TRUE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_timepart.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract time part from ISO 8601 date/time variable — dtc_timepart","text":"dtc Character vector containing ISO 8601 date/times. partial_as_na Logical TRUE FALSE indicating whether partial times set NA (default TRUE). ignore_seconds Logical TRUE FALSE indicating whether seconds ignored (default TRUE).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_timepart.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Extract time part from ISO 8601 date/time variable — dtc_timepart","text":"Character vector containing ISO 8601 times.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dttm_fmt_to_regex.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert a parsed date/time format to regex — dttm_fmt_to_regex","title":"Convert a parsed date/time format to regex — dttm_fmt_to_regex","text":"dttm_fmt_to_regex() takes tibble parsed date/time format components (returned parse_dttm_fmt()), mapping date/time component formats regexps generates single regular expression groups matching date/time components.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dttm_fmt_to_regex.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert a parsed date/time format to regex — dttm_fmt_to_regex","text":"","code":"dttm_fmt_to_regex( fmt, fmt_regex = fmt_rg(), fmt_c = fmt_cmp(), anchored = TRUE )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dttm_fmt_to_regex.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert a parsed date/time format to regex — dttm_fmt_to_regex","text":"fmt format string (scalar) parsed patterns. fmt_regex named character vector regexps, one date/time component. anchored Whether final regex anchored, .e. bounded \"^\" \"$\" whole match.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dttm_fmt_to_regex.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert a parsed date/time format to regex — dttm_fmt_to_regex","text":"string containing regular expression matching date/time components according format.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/eval_conditions.html","id":null,"dir":"Reference","previous_headings":"","what":"Evaluate conditions — eval_conditions","title":"Evaluate conditions — eval_conditions","text":"eval_conditions() evaluates set conditions context data frame optional environment. utility function provide easy way generate logical vector matching records set logical conditions involving variables data frame (dat) optionally supplementary environment (.env). set logical conditions provided expressions evaluated context dat .env. Variables looked dat, .env, calling function's environment, followed parent environments.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/eval_conditions.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Evaluate conditions — eval_conditions","text":"","code":"eval_conditions(dat, ..., .na = NA, .env = rlang::caller_env())"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/eval_conditions.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Evaluate conditions — eval_conditions","text":"dat data frame ... set logical conditions, e.g. y & z, x | z (x, y, z exist either columns dat environment .env). multiple expressions included, combined & operator. .na Return value used conditions evaluate NA. .env optional environment look variables involved logical expression passed .... data frame list can also passed coerced environment internally.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/eval_conditions.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Evaluate conditions — eval_conditions","text":"logical vector reflecting matching rows dat.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/find_int_gap.html","id":null,"dir":"Reference","previous_headings":"","what":"Find gap intervals in integer sequences — find_int_gap","title":"Find gap intervals in integer sequences — find_int_gap","text":"find_int_gap() determines start end positions gap intervals sequence integers. default, interval range look gaps defined minimum maximum values x; specify xmin xmax change range explicitly.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/find_int_gap.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Find gap intervals in integer sequences — find_int_gap","text":"","code":"find_int_gap(x, xmin = min(x), xmax = max(x))"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/find_int_gap.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Find gap intervals in integer sequences — find_int_gap","text":"x integer vector. xmin Left endpoint integer value. xmax Right endpoint integer value.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/find_int_gap.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Find gap intervals in integer sequences — find_int_gap","text":"tibble gap intervals two columns: start: left endpoint end: right endpoint gap intervals found empty tibble returned.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_cmp.html","id":null,"dir":"Reference","previous_headings":"","what":"Regexps for date/time format components — fmt_cmp","title":"Regexps for date/time format components — fmt_cmp","text":"fmt_cmp() creates character vector patterns match individual format date/time components.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_cmp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Regexps for date/time format components — fmt_cmp","text":"","code":"fmt_cmp( sec = \"S+\", min = \"M+\", hour = \"H+\", mday = \"d+\", mon = \"m+\", year = \"y+\" )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_cmp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Regexps for date/time format components — fmt_cmp","text":"sec string pattern matching second format component. min string pattern matching minute format component. hour string pattern matching hour format component. mday string pattern matching month day format component. mon string pattern matching month format component. year string pattern matching year format component.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_cmp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Regexps for date/time format components — fmt_cmp","text":"named character vector date/time format patterns. vector six elements, one date/time component.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_cmp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Regexps for date/time format components — fmt_cmp","text":"","code":"# Regexps to parse format components fmt_cmp() #> $sec #> [1] \"S+\" #> #> $min #> [1] \"M+\" #> #> $hour #> [1] \"H+\" #> #> $mday #> [1] \"d+\" #> #> $mon #> [1] \"m+\" #> #> $year #> [1] \"y+\" #> #> attr(,\"class\") #> [1] \"fmt_c\" fmt_cmp(year = \"yyyy\") #> $sec #> [1] \"S+\" #> #> $min #> [1] \"M+\" #> #> $hour #> [1] \"H+\" #> #> $mday #> [1] \"d+\" #> #> $mon #> [1] \"m+\" #> #> $year #> [1] \"yyyy\" #> #> attr(,\"class\") #> [1] \"fmt_c\""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_rg.html","id":null,"dir":"Reference","previous_headings":"","what":"Regexps for date/time components — fmt_rg","title":"Regexps for date/time components — fmt_rg","text":"fmt_rg() creates character vector named patterns match individual date/time components.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_rg.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Regexps for date/time components — fmt_rg","text":"","code":"fmt_rg( sec = \"(\\\\b\\\\d|\\\\d{2})(\\\\.\\\\d*)?\", min = \"(\\\\b\\\\d|\\\\d{2})\", hour = \"\\\\d?\\\\d\", mday = \"\\\\b\\\\d|\\\\d{2}\", mon = stringr::str_glue(\"\\\\d\\\\d|{months_abb_regex()}\"), year = \"(\\\\d{2})?\\\\d{2}\", na = NULL, sec_na = na, min_na = na, hour_na = na, mday_na = na, mon_na = na, year_na = na )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_rg.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Regexps for date/time components — fmt_rg","text":"sec Regexp second component. min Regexp minute component. hour Regexp hour component. mday Regexp month day component. mon Regexp month component. year Regexp year component. na Regexp alternatives, useful match special values coding missingness. sec_na na specifically second component. min_na na specifically minute component. hour_na na specifically hour component. mday_na na specifically month day component. mon_na na specifically month component. year_na na specifically year component.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_rg.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Regexps for date/time components — fmt_rg","text":"named character vector named patterns (regexps) matching date/time component.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/format_iso8601.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert date/time components into ISO8601 format — format_iso8601","title":"Convert date/time components into ISO8601 format — format_iso8601","text":"format_iso8601() takes character matrix date/time components converts component ISO8601 format. practice entails converting years four digit number, month, day, hours, minutes seconds two-digit numbers. available (NA) components converted \"-\".","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/format_iso8601.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert date/time components into ISO8601 format — format_iso8601","text":"","code":"format_iso8601(m, .cutoff_2000 = 68L)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/format_iso8601.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert date/time components into ISO8601 format — format_iso8601","text":"m character matrix date/time components. must six named columns: year, mon, mday, hour, min sec. .cutoff_2000 integer value. Two-digit years smaller equal .cutoff_2000 parsed though starting 20, otherwise parsed though starting 19.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/format_iso8601.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert date/time components into ISO8601 format — format_iso8601","text":"character vector date-times following ISO8601 format.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/generate_oak_id_vars.html","id":null,"dir":"Reference","previous_headings":"","what":"A function to generate oak_id_vars — generate_oak_id_vars","title":"A function to generate oak_id_vars — generate_oak_id_vars","text":"function generate oak_id_vars","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/generate_oak_id_vars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A function to generate oak_id_vars — generate_oak_id_vars","text":"","code":"generate_oak_id_vars(raw_dat, pat_var, raw_src)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/generate_oak_id_vars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"A function to generate oak_id_vars — generate_oak_id_vars","text":"raw_dat raw dataset (dataframe) pat_var Variable holds patient number raw_src Name raw source","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/generate_oak_id_vars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"A function to generate oak_id_vars — generate_oak_id_vars","text":"dataframe","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/generate_oak_id_vars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"A function to generate oak_id_vars — generate_oak_id_vars","text":"","code":"raw_dataset <- tibble::tribble( ~patnum, ~MDRAW, 101L, \"BABY ASPIRIN\", 102L, \"CORTISPORIN\", 103L, NA_character_, 104L, \"DIPHENHYDRAMINE HCL\" ) # Generate oak_id_vars generate_oak_id_vars( raw_dat = raw_dataset, pat_var = \"patnum\", raw_src = \"Concomitant Medication\" ) #> # A tibble: 4 × 5 #> oak_id raw_source patient_number patnum MDRAW #> #> 1 1 Concomitant Medication 101 101 BABY ASPIRIN #> 2 2 Concomitant Medication 102 102 CORTISPORIN #> 3 3 Concomitant Medication 103 103 NA #> 4 4 Concomitant Medication 104 104 DIPHENHYDRAMINE HCL"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd.html","id":null,"dir":"Reference","previous_headings":"","what":"Get the conditioning vector from a conditioned data frame — get_cnd_df_cnd","title":"Get the conditioning vector from a conditioned data frame — get_cnd_df_cnd","text":"get_cnd_df_cnd() extracts conditioning vector conditioned data frame, .e. object class cnd_df.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get the conditioning vector from a conditioned data frame — get_cnd_df_cnd","text":"","code":"get_cnd_df_cnd(dat)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get the conditioning vector from a conditioned data frame — get_cnd_df_cnd","text":"dat conditioned data frame (cnd_df).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get the conditioning vector from a conditioned data frame — get_cnd_df_cnd","text":"conditioning vector (cnd) dat conditioned data frame (cnd_df), otherwise NULL, NULL dat conditioned data frame (cnd_df).","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd_sum.html","id":null,"dir":"Reference","previous_headings":"","what":"Get the summary of the conditioning vector from a conditioned data frame — get_cnd_df_cnd_sum","title":"Get the summary of the conditioning vector from a conditioned data frame — get_cnd_df_cnd_sum","text":"get_cnd_df_cnd_sum() extracts tally conditioning vector conditioned data frame.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd_sum.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get the summary of the conditioning vector from a conditioned data frame — get_cnd_df_cnd_sum","text":"","code":"get_cnd_df_cnd_sum(dat)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd_sum.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get the summary of the conditioning vector from a conditioned data frame — get_cnd_df_cnd_sum","text":"dat conditioned data frame (cnd_df).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd_sum.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get the summary of the conditioning vector from a conditioned data frame — get_cnd_df_cnd_sum","text":"vector three elements providing sum TRUE, FALSE, NA values conditioning vector (cnd), NULL dat conditioned data frame (cnd_df).","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/harcode.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive an SDTM variable with a hardcoded value — harcode","title":"Derive an SDTM variable with a hardcoded value — harcode","text":"hardcode_no_ct() maps hardcoded value target SDTM variable terminology restrictions. hardcode_ct() maps hardcoded value target SDTM variable controlled terminology recoding.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/harcode.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive an SDTM variable with a hardcoded value — harcode","text":"","code":"hardcode_no_ct( tgt_dat = NULL, tgt_val, raw_dat, raw_var, tgt_var, id_vars = oak_id_vars() ) hardcode_ct( tgt_dat = NULL, tgt_val, raw_dat, raw_var, tgt_var, ct_spec, ct_clst, id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/harcode.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive an SDTM variable with a hardcoded value — harcode","text":"tgt_dat Target dataset: data frame merged raw_dat variables indicated id_vars. parameter optional, see section Value output changes depending argument value. tgt_val target SDTM value hardcoded variable indicated tgt_var. raw_dat raw dataset (dataframe); must include variables passed id_vars raw_var. raw_var raw variable: single string indicating name raw variable raw_dat. tgt_var target SDTM variable: single string indicating name variable derived. id_vars Key variables used join raw dataset (raw_dat) target data set (raw_dat). ct_spec Study controlled terminology specification: dataframe minimal set columns, see ct_spec_vars() details. parameter optional, left NULL controlled terminology recoding applied. ct_clst codelist code indicating subset controlled terminology apply derivation. parameter optional, left NULL, possible recodings ct_spec attempted.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/harcode.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive an SDTM variable with a hardcoded value — harcode","text":"returned data set depends value tgt_dat: target dataset supplied, meaning tgt_dat defaults NULL, returned data set raw_dat, selected variables indicated id_vars, new extra column: derived variable, indicated tgt_var. target dataset provided, merged raw data set raw_dat variables indicated id_vars, new column: derived variable, indicated tgt_var.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/harcode.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Derive an SDTM variable with a hardcoded value — harcode","text":"","code":"md1 <- tibble::tribble( ~oak_id, ~raw_source, ~patient_number, ~MDRAW, 1L, \"MD1\", 101L, \"BABY ASPIRIN\", 2L, \"MD1\", 102L, \"CORTISPORIN\", 3L, \"MD1\", 103L, NA_character_, 4L, \"MD1\", 104L, \"DIPHENHYDRAMINE HCL\" ) # Derive a new variable `CMCAT` by overwriting `MDRAW` with the # hardcoded value \"GENERAL CONCOMITANT MEDICATIONS\". hardcode_no_ct( tgt_val = \"GENERAL CONCOMITANT MEDICATIONS\", raw_dat = md1, raw_var = \"MDRAW\", tgt_var = \"CMCAT\" ) #> # A tibble: 4 × 4 #> oak_id raw_source patient_number CMCAT #> #> 1 1 MD1 101 GENERAL CONCOMITANT MEDICATIONS #> 2 2 MD1 102 GENERAL CONCOMITANT MEDICATIONS #> 3 3 MD1 103 NA #> 4 4 MD1 104 GENERAL CONCOMITANT MEDICATIONS cm_inter <- tibble::tribble( ~oak_id, ~raw_source, ~patient_number, ~CMTRT, ~CMINDC, 1L, \"MD1\", 101L, \"BABY ASPIRIN\", NA, 2L, \"MD1\", 102L, \"CORTISPORIN\", \"NAUSEA\", 3L, \"MD1\", 103L, \"ASPIRIN\", \"ANEMIA\", 4L, \"MD1\", 104L, \"DIPHENHYDRAMINE HCL\", \"NAUSEA\", 5L, \"MD1\", 105L, \"PARACETAMOL\", \"PYREXIA\" ) # Derive a new variable `CMCAT` by overwriting `MDRAW` with the # hardcoded value \"GENERAL CONCOMITANT MEDICATIONS\" with a prior join to # `target_dataset`. hardcode_no_ct( tgt_dat = cm_inter, tgt_val = \"GENERAL CONCOMITANT MEDICATIONS\", raw_dat = md1, raw_var = \"MDRAW\", tgt_var = \"CMCAT\" ) #> # A tibble: 5 × 6 #> oak_id raw_source patient_number CMTRT CMINDC CMCAT #> #> 1 1 MD1 101 BABY ASPIRIN NA GENERAL CONCOMIT… #> 2 2 MD1 102 CORTISPORIN NAUSEA GENERAL CONCOMIT… #> 3 3 MD1 103 ASPIRIN ANEMIA NA #> 4 4 MD1 104 DIPHENHYDRAMINE HCL NAUSEA GENERAL CONCOMIT… #> 5 5 MD1 105 PARACETAMOL PYREXIA NA # Controlled terminology specification (ct_spec <- read_ct_spec_example(\"ct-01-cm\")) #> # A tibble: 33 × 8 #> codelist_code term_code CodedData term_value collected_value #> #> 1 C71113 C25473 QD QD QD (Every Day) #> 2 C71113 C64496 BID BID BID (Twice a Day) #> 3 C71113 C64499 PRN PRN PRN (As Needed) #> 4 C71113 C64516 Q2H Q2H Q2H (Every 2 Hours) #> 5 C71113 C64530 QID QID QID (4 Times a Day) #> 6 C66726 C25158 CAPSULE CAPSULE Capsule #> 7 C66726 C25394 PILL PILL Pill #> 8 C66726 C29167 LOTION LOTION Lotion #> 9 C66726 C42887 AEROSOL AEROSOL Aerosol #> 10 C66726 C42944 INHALANT INHALANT Inhalant #> # ℹ 23 more rows #> # ℹ 3 more variables: term_preferred_term , term_synonyms , #> # raw_codelist # Hardcoding of `CMCAT` with the value `\"GENERAL CONCOMITANT MEDICATIONS\"` # involving terminology recoding. `NA` values in `MDRAW` are preserved in # `CMCAT`. hardcode_ct( tgt_dat = cm_inter, tgt_var = \"CMCAT\", raw_dat = md1, raw_var = \"MDRAW\", tgt_val = \"GENERAL CONCOMITANT MEDICATIONS\", ct_spec = ct_spec, ct_clst = \"C66729\" ) #> # A tibble: 5 × 6 #> oak_id raw_source patient_number CMTRT CMINDC CMCAT #> #> 1 1 MD1 101 BABY ASPIRIN NA GENERAL CONCOMIT… #> 2 2 MD1 102 CORTISPORIN NAUSEA GENERAL CONCOMIT… #> 3 3 MD1 103 ASPIRIN ANEMIA NA #> 4 4 MD1 104 DIPHENHYDRAMINE HCL NAUSEA GENERAL CONCOMIT… #> 5 5 MD1 105 PARACETAMOL PYREXIA NA"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/index_for_recode.html","id":null,"dir":"Reference","previous_headings":"","what":"Determine Indices for Recoding — index_for_recode","title":"Determine Indices for Recoding — index_for_recode","text":"index_for_recode() identifies positions elements x match values specified vector. function primarily used facilitate recoding values pinpointing elements x correspond values thus need replaced updated.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/index_for_recode.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Determine Indices for Recoding — index_for_recode","text":"","code":"index_for_recode(x, from)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/index_for_recode.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Determine Indices for Recoding — index_for_recode","text":"x vector values search matches. vector values match elements x.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/index_for_recode.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Determine Indices for Recoding — index_for_recode","text":"integer vector length x, containing indices matched values vector. element x match value , corresponding position output NA. index information critical subsequent recoding operations.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_cnd_df.html","id":null,"dir":"Reference","previous_headings":"","what":"Check if a data frame is a conditioned data frame — is_cnd_df","title":"Check if a data frame is a conditioned data frame — is_cnd_df","text":"is_cnd_df() checks whether data frame conditioned data frame, .e. class cnd_df.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_cnd_df.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Check if a data frame is a conditioned data frame — is_cnd_df","text":"","code":"is_cnd_df(dat)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_cnd_df.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Check if a data frame is a conditioned data frame — is_cnd_df","text":"dat data frame.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_cnd_df.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Check if a data frame is a conditioned data frame — is_cnd_df","text":"TRUE dat conditioned data frame (class cnd_df), otherwise FALSE.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_seq_name.html","id":null,"dir":"Reference","previous_headings":"","what":"Is it a --SEQ variable name — is_seq_name","title":"Is it a --SEQ variable name — is_seq_name","text":"is_seq_name() returns variable names end \"SEQ\".","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_seq_name.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Is it a --SEQ variable name — is_seq_name","text":"","code":"is_seq_name(x)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_seq_name.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Is it a --SEQ variable name — is_seq_name","text":"x character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_seq_name.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Is it a --SEQ variable name — is_seq_name","text":"logical vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_mon.html","id":null,"dir":"Reference","previous_headings":"","what":"Format as a ISO8601 month — iso8601_mon","title":"Format as a ISO8601 month — iso8601_mon","text":"iso8601_mon() converts character vector whose values represent numeric abbreviated month names zero-padded numeric months.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_mon.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Format as a ISO8601 month — iso8601_mon","text":"","code":"iso8601_mon(x)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_mon.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Format as a ISO8601 month — iso8601_mon","text":"x character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_mon.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Format as a ISO8601 month — iso8601_mon","text":"character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_na.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert NA to ","title":"Convert NA to ","text":"iso8601_na() takes character vector converts NA values \"-\".","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_na.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert NA to ","text":"","code":"iso8601_na(x)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_na.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert NA to ","text":"x character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_na.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert NA to ","text":"character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_sec.html","id":null,"dir":"Reference","previous_headings":"","what":"Format as ISO8601 seconds — iso8601_sec","title":"Format as ISO8601 seconds — iso8601_sec","text":"iso8601_sec() converts character vector whose values represent seconds.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_sec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Format as ISO8601 seconds — iso8601_sec","text":"","code":"iso8601_sec(x)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_sec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Format as ISO8601 seconds — iso8601_sec","text":"x character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_sec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Format as ISO8601 seconds — iso8601_sec","text":"character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_truncate.html","id":null,"dir":"Reference","previous_headings":"","what":"Truncate a partial ISO8601 date-time — iso8601_truncate","title":"Truncate a partial ISO8601 date-time — iso8601_truncate","text":"iso8601_truncate() converts character vector ISO8601 dates, times date-times might partial truncates format removing missing components.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_truncate.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Truncate a partial ISO8601 date-time — iso8601_truncate","text":"","code":"iso8601_truncate(x, empty_as_na = TRUE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_truncate.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Truncate a partial ISO8601 date-time — iso8601_truncate","text":"x character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_truncate.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Truncate a partial ISO8601 date-time — iso8601_truncate","text":"character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_two_digits.html","id":null,"dir":"Reference","previous_headings":"","what":"Format as a ISO8601 two-digit number — iso8601_two_digits","title":"Format as a ISO8601 two-digit number — iso8601_two_digits","text":"iso8601_two_digits() converts single digit two digit number two digit, 0-padded, number. Failing parse input two digit number results NA.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_two_digits.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Format as a ISO8601 two-digit number — iso8601_two_digits","text":"","code":"iso8601_two_digits(x)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_two_digits.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Format as a ISO8601 two-digit number — iso8601_two_digits","text":"x character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_two_digits.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Format as a ISO8601 two-digit number — iso8601_two_digits","text":"character vector size x.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_year.html","id":null,"dir":"Reference","previous_headings":"","what":"Format as a ISO8601 four-digit year — iso8601_year","title":"Format as a ISO8601 four-digit year — iso8601_year","text":"iso8601_year() converts character vector whose values represent years four-digit years.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_year.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Format as a ISO8601 four-digit year — iso8601_year","text":"","code":"iso8601_year(x, cutoff_2000 = 68L)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_year.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Format as a ISO8601 four-digit year — iso8601_year","text":"x character vector. cutoff_2000 non-negative integer value. Two-digit years smaller equal cutoff_2000 parsed though starting 20, otherwise parsed though starting 19.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_year.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Format as a ISO8601 four-digit year — iso8601_year","text":"character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/months_abb_regex.html","id":null,"dir":"Reference","previous_headings":"","what":"Regex for months' abbreviations — months_abb_regex","title":"Regex for months' abbreviations — months_abb_regex","text":"months_abb_regex() generates regex matches month abbreviations. finer control, case can specified parameter case.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/months_abb_regex.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Regex for months' abbreviations — months_abb_regex","text":"","code":"months_abb_regex(x = month.abb, case = c(\"any\", \"upper\", \"lower\", \"title\"))"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/months_abb_regex.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Regex for months' abbreviations — months_abb_regex","text":"x character vector three-letter month abbreviations. Default month.abb. case string scalar: \"\", month abbreviations matched case; \"upper\", match uppercase abbreviations; \"lower\", match lowercase; , \"title\" match title case.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/months_abb_regex.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Regex for months' abbreviations — months_abb_regex","text":"regex string.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/mutate.cnd_df.html","id":null,"dir":"Reference","previous_headings":"","what":"Mutate method for conditioned data frames — mutate.cnd_df","title":"Mutate method for conditioned data frames — mutate.cnd_df","text":"mutate.cnd_df() S3 method dispatched mutate generic conditioned data frames. function implements conditional mutate changing rows condition stored conditioned data frame TRUE.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/mutate.cnd_df.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Mutate method for conditioned data frames — mutate.cnd_df","text":"","code":"# S3 method for cnd_df mutate( .data, ..., .by = NULL, .keep = c(\"all\", \"used\", \"unused\", \"none\"), .before = NULL, .after = NULL )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/mutate.cnd_df.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Mutate method for conditioned data frames — mutate.cnd_df","text":".data conditioned data frame. ... Name-value pairs. name gives name column output. value can : vector length 1, recycled correct length. vector length current group (whole data frame ungrouped). NULL, remove column. data frame tibble, create multiple columns output. .used .data conditioned data frame. .keep Control columns .data retained output. Grouping columns columns created ... always kept. \"\" retains columns .data. default. \"used\" retains columns used ... create new columns. useful checking work, displays inputs outputs side--side. \"unused\" retains columns used ... create new columns. useful generate new columns, longer need columns used generate . \"none\" retain extra columns .data. grouping variables columns created ... kept. .used, use .instead. .Control new columns appear, .e. columns.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/new_cnd_df.html","id":null,"dir":"Reference","previous_headings":"","what":"Create a data frame with filtering tags — new_cnd_df","title":"Create a data frame with filtering tags — new_cnd_df","text":"new_cnd_df() creates conditioned data frame, classed cnd_df, meaning function extends data frame passed argument storing logical vector cnd (attribute) marks rows posterior conditional transformation methods support conditioned data frames.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/new_cnd_df.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create a data frame with filtering tags — new_cnd_df","text":"","code":"new_cnd_df(dat, cnd, .warn = TRUE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/new_cnd_df.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create a data frame with filtering tags — new_cnd_df","text":"dat data frame. cnd logical vector. Length must match number rows dat. .warn Whether warn creating new conditioned data frame case dat already one.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/new_cnd_df.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create a data frame with filtering tags — new_cnd_df","text":"data frame dat additional class \"cnd_df\" following attributes: cnd: logical vector passed argument cnd: TRUE values mark rows dat used transformations; rows marked FALSE transformed; NA mark rows whose transformations applied resulting NA. cnd_sum: integer vector three elements providing sum TRUE, FALSE NA values cnd, respectively.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/oak_id_vars.html","id":null,"dir":"Reference","previous_headings":"","what":"Raw dataset keys — oak_id_vars","title":"Raw dataset keys — oak_id_vars","text":"oak_id_vars() helper function providing variable (column) names regarded keys tibbles representing raw datasets. default, set names oak_id, raw_source, patient_number. Extra variable names may indicated passed extra_vars appended default names.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/oak_id_vars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Raw dataset keys — oak_id_vars","text":"","code":"oak_id_vars(extra_vars = NULL)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/oak_id_vars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Raw dataset keys — oak_id_vars","text":"extra_vars character vector extra column names appended default names: oak_id, raw_source, patient_number.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/oak_id_vars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Raw dataset keys — oak_id_vars","text":"character vector column names regarded keys raw datasets.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm.html","id":null,"dir":"Reference","previous_headings":"","what":"Parse a date, time, or date-time — parse_dttm_","title":"Parse a date, time, or date-time — parse_dttm_","text":"parse_dttm() extracts date time components. parse_dttm() wraps around parse_dttm_(), vectorized fmt.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parse a date, time, or date-time — parse_dttm_","text":"","code":"parse_dttm_( dttm, fmt, fmt_c = fmt_cmp(), na = NULL, sec_na = na, min_na = na, hour_na = na, mday_na = na, mon_na = na, year_na = na ) parse_dttm( dttm, fmt, fmt_c = fmt_cmp(), na = NULL, sec_na = na, min_na = na, hour_na = na, mday_na = na, mon_na = na, year_na = na )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Parse a date, time, or date-time — parse_dttm_","text":"dttm character vector dates, times date-times. fmt case parse_dttm(), character vector parsing formats, single string format case parse_dttm_(). character vector formats passed, format attempted turn first parsing result successful taking precedence final result. formats fmt can strings, however following characters (successive repetitions thereof) reserved sense treated special way: \"y\": parsed year; \"m\": parsed month; \"d\": parsed day; \"H\": parsed hour; \"M\": parsed minute; \"S\": parsed second. na, sec_na, min_na, hour_na, mday_na, mon_na, year_na character vector alternative values allow matching. can used indicate different forms missing values found parsing date-time strings.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Parse a date, time, or date-time — parse_dttm_","text":"character matrix six columns: \"year\", \"mon\", \"mday\", \"hour\", \"min\" \"sec\". row corresponds element dttm. element matrix parsed date/time component.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm_fmt.html","id":null,"dir":"Reference","previous_headings":"","what":"Parse a date/time format — parse_dttm_fmt_","title":"Parse a date/time format — parse_dttm_fmt_","text":"parse_dttm_fmt() parses date/time formats, meaning try parse components format fmt refer date/time components. parse_dttm_fmt_() similar parse_dttm_fmt() vectorized fmt.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm_fmt.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parse a date/time format — parse_dttm_fmt_","text":"","code":"parse_dttm_fmt_(fmt, pattern) parse_dttm_fmt(fmt, patterns = fmt_cmp())"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm_fmt.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Parse a date/time format — parse_dttm_fmt_","text":"fmt format string (scalar) parsed patterns. pattern, patterns string (case pattern), character vector (case patterns) regexps individual date/time components. Default value fmt_cmp(). Use function plan passing different set patterns.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm_fmt.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Parse a date/time format — parse_dttm_fmt_","text":"tibble seven columns: fmt_c: date/time format component. Values either \"year\", \"mon\", \"mday\", \"hour\", \"min\", \"sec\", NA. pat: Regexp used parse date/time component. cap: captured substring format. start: Start position format string capture. end: End position format string capture. len: Length capture (number chars). ord: Ordinal date/time component format string. row either date/time format component \"delimiter\" string pattern -format components.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/problems.html","id":null,"dir":"Reference","previous_headings":"","what":"Retrieve date/time parsing problems — problems","title":"Retrieve date/time parsing problems — problems","text":"problems() companion helper function create_iso8601(). retrieves ISO 8601 parsing problems object class iso8601, create_iso8601()'s return value might contain problems attribute case parsing failures. problems() helper function provides easy access parsing problems.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/problems.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Retrieve date/time parsing problems — problems","text":"","code":"problems(x = .Last.value)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/problems.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Retrieve date/time parsing problems — problems","text":"x object class iso8601, typically obtained call create_iso8601(). argument can also left empty, case problems() use last returned value, making convenient use immediately create_iso8601().","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/problems.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Retrieve date/time parsing problems — problems","text":"parsing problems x, returned value NULL; otherwise, tibble parsing failures returned. row corresponds parsing problem. first column named ..indicating position(s) inputs create_iso8601() call resulted failures; remaining columns correspond original input values passed create_iso8601(), columns automatically named ..var1, ..var2, , inputs create_iso8601() unnamed, otherwise, original variable names used instead.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/problems.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Retrieve date/time parsing problems — problems","text":"","code":"dates <- c( \"2020-01-01\", \"2020-02-11\", \"2020-01-06\", \"2020-0921\", \"2020/10/30\", \"2020-12-05\", \"20231225\" ) # By inspecting the problematic dates it can be understood that # the `.format` parameter needs to updated to include other variations. iso8601_dttm <- create_iso8601(dates, .format = \"y-m-d\") problems(iso8601_dttm) #> # A tibble: 3 × 2 #> ..i ..var1 #> #> 1 4 2020-0921 #> 2 5 2020/10/30 #> 3 7 20231225 # Including more parsing formats addresses the previous problems formats <- c(\"y-m-d\", \"y-md\", \"y/m/d\", \"ymd\") iso8601_dttm2 <- create_iso8601(dates, .format = list(formats)) # So now `problems()` returns `NULL` because there are no more parsing issues. problems(iso8601_dttm2) # If you pass named arguments when calling `create_iso8601()` then they will # be used to create the problems object. iso8601_dttm3 <- create_iso8601(date = dates, .format = \"y-m-d\") problems(iso8601_dttm3) #> # A tibble: 3 × 2 #> ..i date #> #> 1 4 2020-0921 #> 2 5 2020/10/30 #> 3 7 20231225"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/pseq.html","id":null,"dir":"Reference","previous_headings":"","what":"Parallel sequence generation — pseq","title":"Parallel sequence generation — pseq","text":"pseq() similar seq() conveniently accepts integer vectors inputs , allowing parallel generation sequences. result union generated sequences.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/pseq.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parallel sequence generation — pseq","text":"","code":"pseq(from, to)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/pseq.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Parallel sequence generation — pseq","text":"integer vector. starting value(s) sequence(s). integer vector. ending value(s) sequence(s).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/pseq.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Parallel sequence generation — pseq","text":"integer vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec.html","id":null,"dir":"Reference","previous_headings":"","what":"Read in a controlled terminology — read_ct_spec","title":"Read in a controlled terminology — read_ct_spec","text":"read_ct_spec() imports controlled terminology specification data set tibble.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read in a controlled terminology — read_ct_spec","text":"","code":"read_ct_spec(file = stop(\"`file` must be specified\"))"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read in a controlled terminology — read_ct_spec","text":"file path file containing controlled terminology specification data set. following expected file: file expected CSV file; file expected contain first row column names; minimal set variables expected: codelist_code, collected_value, term_synonyms, term_value.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Read in a controlled terminology — read_ct_spec","text":"tibble controlled terminology specification.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read in a controlled terminology — read_ct_spec","text":"","code":"# Get the local path to one of the controlled terminology example files. path <- ct_spec_example(\"ct-01-cm\") # Import it to R. read_ct_spec(file = path) #> # A tibble: 33 × 8 #> codelist_code term_code CodedData term_value collected_value #> #> 1 C71113 C25473 QD QD QD (Every Day) #> 2 C71113 C64496 BID BID BID (Twice a Day) #> 3 C71113 C64499 PRN PRN PRN (As Needed) #> 4 C71113 C64516 Q2H Q2H Q2H (Every 2 Hours) #> 5 C71113 C64530 QID QID QID (4 Times a Day) #> 6 C66726 C25158 CAPSULE CAPSULE Capsule #> 7 C66726 C25394 PILL PILL Pill #> 8 C66726 C29167 LOTION LOTION Lotion #> 9 C66726 C42887 AEROSOL AEROSOL Aerosol #> 10 C66726 C42944 INHALANT INHALANT Inhalant #> # ℹ 23 more rows #> # ℹ 3 more variables: term_preferred_term , term_synonyms , #> # raw_codelist "},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec_example.html","id":null,"dir":"Reference","previous_headings":"","what":"Read an example controlled terminology specification — read_ct_spec_example","title":"Read an example controlled terminology specification — read_ct_spec_example","text":"read_ct_spec_example() imports one bundled controlled terminology specification data sets tibble R.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec_example.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read an example controlled terminology specification — read_ct_spec_example","text":"","code":"read_ct_spec_example(example)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec_example.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read an example controlled terminology specification — read_ct_spec_example","text":"example file name controlled terminology data set bundled {stdm.oak}, run read_ct_spec_example() available example files.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec_example.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Read an example controlled terminology specification — read_ct_spec_example","text":"tibble controlled terminology specification data set, character vector example file names.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec_example.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read an example controlled terminology specification — read_ct_spec_example","text":"","code":"# Leave the `example` parameter as missing for available example files. read_ct_spec_example() #> [1] \"ct-01-cm.csv\" # Read an example controlled terminology spec file. read_ct_spec_example(\"ct-01-cm.csv\") #> # A tibble: 33 × 8 #> codelist_code term_code CodedData term_value collected_value #> #> 1 C71113 C25473 QD QD QD (Every Day) #> 2 C71113 C64496 BID BID BID (Twice a Day) #> 3 C71113 C64499 PRN PRN PRN (As Needed) #> 4 C71113 C64516 Q2H Q2H Q2H (Every 2 Hours) #> 5 C71113 C64530 QID QID QID (4 Times a Day) #> 6 C66726 C25158 CAPSULE CAPSULE Capsule #> 7 C66726 C25394 PILL PILL Pill #> 8 C66726 C29167 LOTION LOTION Lotion #> 9 C66726 C42887 AEROSOL AEROSOL Aerosol #> 10 C66726 C42944 INHALANT INHALANT Inhalant #> # ℹ 23 more rows #> # ℹ 3 more variables: term_preferred_term , term_synonyms , #> # raw_codelist # You may omit the file extension. read_ct_spec_example(\"ct-01-cm\") #> # A tibble: 33 × 8 #> codelist_code term_code CodedData term_value collected_value #> #> 1 C71113 C25473 QD QD QD (Every Day) #> 2 C71113 C64496 BID BID BID (Twice a Day) #> 3 C71113 C64499 PRN PRN PRN (As Needed) #> 4 C71113 C64516 Q2H Q2H Q2H (Every 2 Hours) #> 5 C71113 C64530 QID QID QID (4 Times a Day) #> 6 C66726 C25158 CAPSULE CAPSULE Capsule #> 7 C66726 C25394 PILL PILL Pill #> 8 C66726 C29167 LOTION LOTION Lotion #> 9 C66726 C42887 AEROSOL AEROSOL Aerosol #> 10 C66726 C42944 INHALANT INHALANT Inhalant #> # ℹ 23 more rows #> # ℹ 3 more variables: term_preferred_term , term_synonyms , #> # raw_codelist "},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_domain_example.html","id":null,"dir":"Reference","previous_headings":"","what":"Read an example SDTM domain — read_domain_example","title":"Read an example SDTM domain — read_domain_example","text":"read_domain_example() imports one bundled SDTM domain examples tibble R. See domain_example() possible choices.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_domain_example.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read an example SDTM domain — read_domain_example","text":"","code":"read_domain_example(example)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_domain_example.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read an example SDTM domain — read_domain_example","text":"example name SDTM domain example, e.g. \"cm\" (Concomitant Medication) \"ae\" (Adverse Events). Run read_domain_example() available example files.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_domain_example.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Read an example SDTM domain — read_domain_example","text":"tibble SDTM domain dataset, character vector example file names.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_domain_example.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read an example SDTM domain — read_domain_example","text":"","code":"# Leave the `example` parameter as missing for available example files. read_domain_example() #> [1] \"ae\" \"apsc\" \"cm\" \"vs\" # Read the example Concomitant Medication domain. read_domain_example(\"cm\") #> # A tibble: 7,510 × 21 #> STUDYID DOMAIN USUBJID CMSEQ CMSPID CMTRT CMDECOD CMINDC CMCLAS CMDOSE CMDOSU #> #> 1 CDISCP… CM 01-701… 1 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 2 CDISCP… CM 01-701… 5 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 3 CDISCP… CM 01-701… 9 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 4 CDISCP… CM 01-701… 13 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 5 CDISCP… CM 01-701… 18 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 6 CDISCP… CM 01-701… 23 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 7 CDISCP… CM 01-701… 28 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 8 CDISCP… CM 01-701… 33 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 9 CDISCP… CM 01-701… 38 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 10 CDISCP… CM 01-701… 43 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> # ℹ 7,500 more rows #> # ℹ 10 more variables: CMDOSFRQ , CMROUTE , VISITNUM , #> # VISIT , VISITDY , CMDTC , CMSTDTC , CMENDTC , #> # CMSTDY , CMENDY # Read the example Adverse Events domain. read_domain_example(\"ae\") #> # A tibble: 1,191 × 35 #> STUDYID DOMAIN USUBJID AESEQ AESPID AETERM AELLT AELLTCD AEDECOD AEPTCD AEHLT #> #> 1 CDISCP… AE 01-701… 1 E07 APPLI… APPL… NA APPLIC… NA HLT_… #> 2 CDISCP… AE 01-701… 2 E08 APPLI… APPL… NA APPLIC… NA HLT_… #> 3 CDISCP… AE 01-701… 3 E06 DIARR… DIAR… NA DIARRH… NA HLT_… #> 4 CDISCP… AE 01-701… 3 E10 ATRIO… AV B… NA ATRIOV… NA HLT_… #> 5 CDISCP… AE 01-701… 1 E08 ERYTH… ERYT… NA ERYTHE… NA HLT_… #> 6 CDISCP… AE 01-701… 2 E09 ERYTH… LOCA… NA ERYTHE… NA HLT_… #> 7 CDISCP… AE 01-701… 4 E08 ERYTH… ERYT… NA ERYTHE… NA HLT_… #> 8 CDISCP… AE 01-701… 1 E04 APPLI… APPL… NA APPLIC… NA HLT_… #> 9 CDISCP… AE 01-701… 2 E05 APPLI… APPL… NA APPLIC… NA HLT_… #> 10 CDISCP… AE 01-701… 1 E08 APPLI… APPL… NA APPLIC… NA HLT_… #> # ℹ 1,181 more rows #> # ℹ 24 more variables: AEHLTCD , AEHLGT , AEHLGTCD , #> # AEBODSYS , AEBDSYCD , AESOC , AESOCCD , AESEV , #> # AESER , AEACN , AEREL , AEOUT , AESCAN , #> # AESCONG , AESDISAB , AESDTH , AESHOSP , AESLIFE , #> # AESOD , AEDTC , AESTDTC , AEENDTC , AESTDY , #> # AEENDY "},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/recode.html","id":null,"dir":"Reference","previous_headings":"","what":"Recode values — recode","title":"Recode values — recode","text":"recode() recodes values x matching elements onto values .","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/recode.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Recode values — recode","text":"","code":"recode(x, from = unique(na.omit(x)), to = from, .no_match = x, .na = NA)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/recode.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Recode values — recode","text":"x atomic vector values recoded. vector values matched x recoding. vector values used replacement values . .no_match Value used replacement cases matched. .na Value used recode missing values.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/recode.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Recode values — recode","text":"vector recoded values.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/reg_matches.html","id":null,"dir":"Reference","previous_headings":"","what":"regmatches() with NA — reg_matches","title":"regmatches() with NA — reg_matches","text":"reg_matches() thin wrapper around regmatches() returns NA instead character(0) matching fails.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/reg_matches.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"regmatches() with NA — reg_matches","text":"","code":"reg_matches(x, m, invert = FALSE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/reg_matches.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"regmatches() with NA — reg_matches","text":"x character vector. m object match data. invert logical scalar. TRUE, extract replace non-matched substrings.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/reg_matches.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"regmatches() with NA — reg_matches","text":"list character vectors matched substrings, NA matching failed.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/regex_or.html","id":null,"dir":"Reference","previous_headings":"","what":"Utility function to assemble a regex of alternative patterns — regex_or","title":"Utility function to assemble a regex of alternative patterns — regex_or","text":"regex_or() takes set patterns binds (\"|\") pattern easy regex alternative patterns.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/regex_or.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Utility function to assemble a regex of alternative patterns — regex_or","text":"","code":"regex_or(x, .open = FALSE, .close = FALSE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/regex_or.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Utility function to assemble a regex of alternative patterns — regex_or","text":"x character vector alternative patterns. .open Whether resulting regex start \"|\". .close Whether resulting regex end \"|\".","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/regex_or.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Utility function to assemble a regex of alternative patterns — regex_or","text":"character scalar resulting regex.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/rm_cnd_df.html","id":null,"dir":"Reference","previous_headings":"","what":"Remove the cnd_df class from a data frame — rm_cnd_df","title":"Remove the cnd_df class from a data frame — rm_cnd_df","text":"function removes cnd_df class, along attributes, applicable.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/rm_cnd_df.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Remove the cnd_df class from a data frame — rm_cnd_df","text":"","code":"rm_cnd_df(dat)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/rm_cnd_df.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Remove the cnd_df class from a data frame — rm_cnd_df","text":"dat data frame.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/rm_cnd_df.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Remove the cnd_df class from a data frame — rm_cnd_df","text":"input dat without cnd_df class associated attributes.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sbj_vars.html","id":null,"dir":"Reference","previous_headings":"","what":"Subject-level key variables — sbj_vars","title":"Subject-level key variables — sbj_vars","text":"sbj_vars() returns set variable names uniquely define subject.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sbj_vars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Subject-level key variables — sbj_vars","text":"","code":"sbj_vars()"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sbj_vars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Subject-level key variables — sbj_vars","text":"character vector variable names.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sbj_vars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Subject-level key variables — sbj_vars","text":"","code":"sbj_vars() #> [1] \"STUDYID\" \"USUBJID\""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm.oak-package.html","id":null,"dir":"Reference","previous_headings":"","what":"sdtm.oak: SDTM Data Transformation Engine — sdtm.oak-package","title":"sdtm.oak: SDTM Data Transformation Engine — sdtm.oak-package","text":"EDC Data Standard-agnostic SDTM data transformation engine designed SDTM programming R. Powered metadata sdtm.oak can automate conversion raw clinical data SDTM standardized mapping algorithms. SDTM one required standards data submission FDA (U.S.) PMDA (Japan). SDTM standards implemented accordance SDTM Implementation Guide defined CDISC https://www.cdisc.org/standards/foundational/sdtmig.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm.oak-package.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"sdtm.oak: SDTM Data Transformation Engine — sdtm.oak-package","text":"Maintainer: Rammprasad Ganapathy ganapathy.rammprasad@gene.com Authors: Adam Forys Edgar Manukyan Rosemary Li Preetesh Parikh Lisa Houterloot Yogesh Gupta Omar Garcia ogcalderon@cdisc.org Ramiro Magno rmagno@pattern.institute (ORCID) Kamil Sijko kamil.sijko@ttsi.com.pl (ORCID) Shiyu Chen Shiyu.Chen@atorusresearch.com contributors: Pattern Institute [copyright holder, funder] F. Hoffmann-La Roche AG [copyright holder, funder] Pfizer Inc [copyright holder, funder] Transition Technologies Science [copyright holder, funder]","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_assign.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive an SDTM variable — sdtm_assign","title":"Derive an SDTM variable — sdtm_assign","text":"sdtm_assign() internal function packing functionality assign_no_ct() assign_ct() together aimed developers . user please use either assign_no_ct() assign_ct().","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_assign.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive an SDTM variable — sdtm_assign","text":"","code":"sdtm_assign( tgt_dat = NULL, tgt_var, raw_dat, raw_var, ct_spec = NULL, ct_clst = NULL, id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_assign.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive an SDTM variable — sdtm_assign","text":"tgt_dat Target dataset: data frame merged raw_dat variables indicated id_vars. parameter optional, see section Value output changes depending argument value. tgt_var target SDTM variable: single string indicating name variable derived. raw_dat raw dataset (dataframe); must include variables passed id_vars raw_var. raw_var raw variable: single string indicating name raw variable raw_dat. ct_spec Study controlled terminology specification: dataframe minimal set columns, see ct_spec_vars() details. parameter optional, left NULL controlled terminology recoding applied. ct_clst codelist code indicating subset controlled terminology apply derivation. parameter optional, left NULL, possible recodings ct_spec attempted. id_vars Key variables used join raw dataset (raw_dat) target data set (tgt_dat).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_assign.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive an SDTM variable — sdtm_assign","text":"returned data set depends value tgt_dat: target dataset supplied, meaning tgt_dat defaults NULL, returned data set raw_dat, selected variables indicated id_vars, new extra column: derived variable, indicated tgt_var. target dataset provided, merged raw data set raw_dat variables indicated id_vars, new column: derived variable, indicated tgt_var.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_hardcode.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive an SDTM variable with a hardcoded value — sdtm_hardcode","title":"Derive an SDTM variable with a hardcoded value — sdtm_hardcode","text":"sdtm_hardcode() internal function packing functionality hardcode_no_ct() hardcode_ct() together aimed developers . user please use either hardcode_no_ct() hardcode_ct().","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_hardcode.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive an SDTM variable with a hardcoded value — sdtm_hardcode","text":"","code":"sdtm_hardcode( tgt_dat = NULL, tgt_var, raw_dat, raw_var, tgt_val, ct_spec = NULL, ct_clst = NULL, id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_hardcode.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive an SDTM variable with a hardcoded value — sdtm_hardcode","text":"tgt_dat Target dataset: data frame merged raw_dat variables indicated id_vars. parameter optional, see section Value output changes depending argument value. tgt_var target SDTM variable: single string indicating name variable derived. raw_dat raw dataset (dataframe); must include variables passed id_vars raw_var. raw_var raw variable: single string indicating name raw variable raw_dat. tgt_val target SDTM value hardcoded variable indicated tgt_var. ct_spec Study controlled terminology specification: dataframe minimal set columns, see ct_spec_vars() details. parameter optional, left NULL controlled terminology recoding applied. ct_clst codelist code indicating subset controlled terminology apply derivation. parameter optional, left NULL, possible recodings ct_spec attempted. id_vars Key variables used join raw dataset (raw_dat) target data set (tgt_dat).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_hardcode.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive an SDTM variable with a hardcoded value — sdtm_hardcode","text":"returned data set depends value tgt_dat: target dataset supplied, meaning tgt_dat defaults NULL, returned data set raw_dat, selected variables indicated id_vars, new extra column: derived variable, indicated tgt_var. target dataset provided, merged raw data set raw_dat variables indicated id_vars, new column: derived variable, indicated tgt_var.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_join.html","id":null,"dir":"Reference","previous_headings":"","what":"SDTM join — sdtm_join","title":"SDTM join — sdtm_join","text":"sdtm_join() special join raw data set target data set. function supports conditioned data frames. sdtm_join() special join raw data set target data set. function supports conditioned data frames.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_join.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"SDTM join — sdtm_join","text":"","code":"sdtm_join(raw_dat, tgt_dat = NULL, id_vars = oak_id_vars()) sdtm_join(raw_dat, tgt_dat = NULL, id_vars = oak_id_vars())"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_join.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"SDTM join — sdtm_join","text":"raw_dat raw dataset: dataframe conditioned data frame. Must include variables passed id_vars. tgt_dat Target dataset: data frame conditioned data frame merged raw_dat variables indicated id_vars. id_vars Key variables used join raw dataset (raw_dat) target data set (tgt_dat).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_join.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"SDTM join — sdtm_join","text":"data frame, conditioned data frame least one input data sets conditioned data frame. data frame, conditioned data frame , least, one input data sets conditioned data frame.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/str_to_anycase.html","id":null,"dir":"Reference","previous_headings":"","what":"Generate case insensitive regexps — str_to_anycase","title":"Generate case insensitive regexps — str_to_anycase","text":"str_to_anycase() takes character vector word strings input, generates regular expressions express match case.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/str_to_anycase.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generate case insensitive regexps — str_to_anycase","text":"","code":"str_to_anycase(x)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/str_to_anycase.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generate case insensitive regexps — str_to_anycase","text":"x character vector strings consisting word characters.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/str_to_anycase.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generate case insensitive regexps — str_to_anycase","text":"character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/tbl_sum.cnd_df.html","id":null,"dir":"Reference","previous_headings":"","what":"Conditioned tibble header print method — tbl_sum.cnd_df","title":"Conditioned tibble header print method — tbl_sum.cnd_df","text":"Conditioned tibble header print method. S3 method adds extra line header tibble indicates tibble conditioned tibble (# Cond. tbl:) followed tally conditioning vector: number TRUE, FALSE NA values: e.g., 1/1/1.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/tbl_sum.cnd_df.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Conditioned tibble header print method — tbl_sum.cnd_df","text":"","code":"# S3 method for cnd_df tbl_sum(x, ...)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/tbl_sum.cnd_df.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Conditioned tibble header print method — tbl_sum.cnd_df","text":"x conditioned tibble class cnd_df. ... Additional arguments passed default print method.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/tbl_sum.cnd_df.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Conditioned tibble header print method — tbl_sum.cnd_df","text":"","code":"df <- data.frame(x = c(1L, NA_integer_, 3L)) (cnd_df <- condition_add(dat = df, x >= 2L)) #> # A tibble: 3 × 1 #> # Cond. tbl: 1/1/1 #> x #> #> 1 F 1 #> 2 - NA #> 3 T 3 pillar::tbl_sum(cnd_df) #> A tibble Cond. tbl #> \"3 × 1\" \"1/1/1\""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/yy_to_yyyy.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert two-digit to four-digit years — yy_to_yyyy","title":"Convert two-digit to four-digit years — yy_to_yyyy","text":"yy_to_yyyy() converts two-digit years four-digit years.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/yy_to_yyyy.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert two-digit to four-digit years — yy_to_yyyy","text":"","code":"yy_to_yyyy(x, cutoff_2000 = 68L)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/yy_to_yyyy.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert two-digit to four-digit years — yy_to_yyyy","text":"x integer vector years. cutoff_2000 integer value. Two-digit years smaller equal cutoff_2000 parsed though starting 20, otherwise parsed though starting 19.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/yy_to_yyyy.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert two-digit to four-digit years — yy_to_yyyy","text":"integer vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/zero_pad_whole_number.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert an integer to a zero-padded character vector — zero_pad_whole_number","title":"Convert an integer to a zero-padded character vector — zero_pad_whole_number","text":"zero_pad_whole_number() takes non-negative integer values converts character zero padding. Negative numbers numbers greater width specified number digits n converted NA.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/zero_pad_whole_number.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert an integer to a zero-padded character vector — zero_pad_whole_number","text":"","code":"zero_pad_whole_number(x, n = 2L)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/zero_pad_whole_number.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert an integer to a zero-padded character vector — zero_pad_whole_number","text":"x integer vector. n Number digits output, including zero padding.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/zero_pad_whole_number.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert an integer to a zero-padded character vector — zero_pad_whole_number","text":"character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/news/index.html","id":"sdtmoak-0009005-development-version","dir":"Changelog","previous_headings":"","what":"sdtm.oak 0.0.0.9005 (development version)","title":"sdtm.oak 0.0.0.9005 (development version)","text":"New function creating conditioned data frames: condition_add(). New pipe operator: %.>% explicit dot placeholder placement. oak_id_vars() now exported function.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/news/index.html","id":"sdtmoak-0009004-development-version","dir":"Changelog","previous_headings":"","what":"sdtm.oak 0.0.0.9004 (development version)","title":"sdtm.oak 0.0.0.9004 (development version)","text":"New function: derive_seq() deriving sequence number variable.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/news/index.html","id":"new-features-0-0-0-9003","dir":"Changelog","previous_headings":"","what":"New Features","title":"sdtm.oak 0.0.0.9003 (development version)","text":"New function: assign_datetime() deriving ISO8601 date-time variable.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/news/index.html","id":"new-features-0-0-0-9002","dir":"Changelog","previous_headings":"","what":"New Features","title":"sdtm.oak 0.0.0.9002 (development version)","text":"New function: derive_study_day() study day calculation. New functions basic SDTM derivations: assign_no_ct(), assign_ct(), hardcode_no_ct() hardcode_ct(). New functions handling controlled terminologies: read_ct_spec(), read_ct_spec_example(), ct_spec_example() ct_map().","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/news/index.html","id":"new-features-0-0-0-9001","dir":"Changelog","previous_headings":"","what":"New Features","title":"sdtm.oak 0.0.0.9001 (development version)","text":"New function create_iso8601() conversion vectors dates, times date-times ISO8601 format.","code":""}] +[{"path":"https://pharmaverse.github.io/sdtm.oak/CODE_OF_CONDUCT.html","id":null,"dir":"","previous_headings":"","what":"Contributor Code of Conduct","title":"Contributor Code of Conduct","text":"contributors maintainers project, pledge respect people contribute reporting issues, posting feature requests, updating documentation, submitting pull requests patches, activities. committed making participation project harassment-free experience everyone, regardless level experience, gender, gender identity expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion. Examples unacceptable behavior participants include use sexual language imagery, derogatory comments personal attacks, trolling, public private harassment, insults, unprofessional conduct. Project maintainers right responsibility remove, edit, reject comments, commits, code, wiki edits, issues, contributions aligned Code Conduct. Project maintainers follow Code Conduct may removed project team. Instances abusive, harassing, otherwise unacceptable behavior may reported opening issue contacting one project maintainers. Code Conduct adapted Contributor Covenant (http://contributor-covenant.org), version 1.0.0, available http://contributor-covenant.org/version/1/0/0/","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/CONTRIBUTING.html","id":null,"dir":"","previous_headings":"","what":"Contribution to {sdtm.oak}","title":"Contribution to {sdtm.oak}","text":"outlines propose change sdtm.oak package. detailed info contributing {sdtm.oak}, pharmaverse packages, please see Contribution Guide well Developer Guides Articles section {admiraldev} website. Please note try align best practices used R packages’ development processes - veteran developers familiar processes. However, deviate slightly best practices advise new contributors review package documentation accordingly.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/CONTRIBUTING.html","id":"basics","dir":"","previous_headings":"","what":"Basics","title":"Contribution to {sdtm.oak}","text":"new contribution, user creates issue issue tab GitHub put backlog. issues can range bug identification /fixes, enhancements functions, documentation, tests new features. advise contact us issue created via Slack (don’t access, use link join). can discuss details align expectations familiar sdtm.oak philosophy programming strategy. team try review issues within next backlog meeting give initial feedback. Since 100% fully resourced software development team might issues take longer respond depending amount overall issues.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":null,"dir":"","previous_headings":"","what":"Apache License","title":"Apache License","text":"Version 2.0, January 2004 ","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_1-definitions","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"1. Definitions","title":"Apache License","text":"“License” shall mean terms conditions use, reproduction, distribution defined Sections 1 9 document. “Licensor” shall mean copyright owner entity authorized copyright owner granting License. “Legal Entity” shall mean union acting entity entities control, controlled , common control entity. purposes definition, “control” means () power, direct indirect, cause direction management entity, whether contract otherwise, (ii) ownership fifty percent (50%) outstanding shares, (iii) beneficial ownership entity. “” (“”) shall mean individual Legal Entity exercising permissions granted License. “Source” form shall mean preferred form making modifications, including limited software source code, documentation source, configuration files. “Object” form shall mean form resulting mechanical transformation translation Source form, including limited compiled object code, generated documentation, conversions media types. “Work” shall mean work authorship, whether Source Object form, made available License, indicated copyright notice included attached work (example provided Appendix ). “Derivative Works” shall mean work, whether Source Object form, based (derived ) Work editorial revisions, annotations, elaborations, modifications represent, whole, original work authorship. purposes License, Derivative Works shall include works remain separable , merely link (bind name) interfaces , Work Derivative Works thereof. “Contribution” shall mean work authorship, including original version Work modifications additions Work Derivative Works thereof, intentionally submitted Licensor inclusion Work copyright owner individual Legal Entity authorized submit behalf copyright owner. purposes definition, “submitted” means form electronic, verbal, written communication sent Licensor representatives, including limited communication electronic mailing lists, source code control systems, issue tracking systems managed , behalf , Licensor purpose discussing improving Work, excluding communication conspicuously marked otherwise designated writing copyright owner “Contribution.” “Contributor” shall mean Licensor individual Legal Entity behalf Contribution received Licensor subsequently incorporated within Work.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_2-grant-of-copyright-license","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"2. Grant of Copyright License","title":"Apache License","text":"Subject terms conditions License, Contributor hereby grants perpetual, worldwide, non-exclusive, -charge, royalty-free, irrevocable copyright license reproduce, prepare Derivative Works , publicly display, publicly perform, sublicense, distribute Work Derivative Works Source Object form.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_3-grant-of-patent-license","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"3. Grant of Patent License","title":"Apache License","text":"Subject terms conditions License, Contributor hereby grants perpetual, worldwide, non-exclusive, -charge, royalty-free, irrevocable (except stated section) patent license make, made, use, offer sell, sell, import, otherwise transfer Work, license applies patent claims licensable Contributor necessarily infringed Contribution(s) alone combination Contribution(s) Work Contribution(s) submitted. institute patent litigation entity (including cross-claim counterclaim lawsuit) alleging Work Contribution incorporated within Work constitutes direct contributory patent infringement, patent licenses granted License Work shall terminate date litigation filed.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_4-redistribution","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"4. Redistribution","title":"Apache License","text":"may reproduce distribute copies Work Derivative Works thereof medium, without modifications, Source Object form, provided meet following conditions: () must give recipients Work Derivative Works copy License; (b) must cause modified files carry prominent notices stating changed files; (c) must retain, Source form Derivative Works distribute, copyright, patent, trademark, attribution notices Source form Work, excluding notices pertain part Derivative Works; (d) Work includes “NOTICE” text file part distribution, Derivative Works distribute must include readable copy attribution notices contained within NOTICE file, excluding notices pertain part Derivative Works, least one following places: within NOTICE text file distributed part Derivative Works; within Source form documentation, provided along Derivative Works; , within display generated Derivative Works, wherever third-party notices normally appear. contents NOTICE file informational purposes modify License. may add attribution notices within Derivative Works distribute, alongside addendum NOTICE text Work, provided additional attribution notices construed modifying License. may add copyright statement modifications may provide additional different license terms conditions use, reproduction, distribution modifications, Derivative Works whole, provided use, reproduction, distribution Work otherwise complies conditions stated License.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_5-submission-of-contributions","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"5. Submission of Contributions","title":"Apache License","text":"Unless explicitly state otherwise, Contribution intentionally submitted inclusion Work Licensor shall terms conditions License, without additional terms conditions. Notwithstanding , nothing herein shall supersede modify terms separate license agreement may executed Licensor regarding Contributions.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_6-trademarks","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"6. Trademarks","title":"Apache License","text":"License grant permission use trade names, trademarks, service marks, product names Licensor, except required reasonable customary use describing origin Work reproducing content NOTICE file.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_7-disclaimer-of-warranty","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"7. Disclaimer of Warranty","title":"Apache License","text":"Unless required applicable law agreed writing, Licensor provides Work (Contributor provides Contributions) “” BASIS, WITHOUT WARRANTIES CONDITIONS KIND, either express implied, including, without limitation, warranties conditions TITLE, NON-INFRINGEMENT, MERCHANTABILITY, FITNESS PARTICULAR PURPOSE. solely responsible determining appropriateness using redistributing Work assume risks associated exercise permissions License.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_8-limitation-of-liability","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"8. Limitation of Liability","title":"Apache License","text":"event legal theory, whether tort (including negligence), contract, otherwise, unless required applicable law (deliberate grossly negligent acts) agreed writing, shall Contributor liable damages, including direct, indirect, special, incidental, consequential damages character arising result License use inability use Work (including limited damages loss goodwill, work stoppage, computer failure malfunction, commercial damages losses), even Contributor advised possibility damages.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"id_9-accepting-warranty-or-additional-liability","dir":"","previous_headings":"Terms and Conditions for use, reproduction, and distribution","what":"9. Accepting Warranty or Additional Liability","title":"Apache License","text":"redistributing Work Derivative Works thereof, may choose offer, charge fee , acceptance support, warranty, indemnity, liability obligations /rights consistent License. However, accepting obligations, may act behalf sole responsibility, behalf Contributor, agree indemnify, defend, hold Contributor harmless liability incurred , claims asserted , Contributor reason accepting warranty additional liability. END TERMS CONDITIONS","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/LICENSE.html","id":"appendix-how-to-apply-the-apache-license-to-your-work","dir":"","previous_headings":"","what":"APPENDIX: How to apply the Apache License to your work","title":"Apache License","text":"apply Apache License work, attach following boilerplate notice, fields enclosed brackets [] replaced identifying information. (Don’t include brackets!) text enclosed appropriate comment syntax file format. also recommend file class name description purpose included “printed page” copyright notice easier identification within third-party archives.","code":"Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the \"License\"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License."},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/algorithms.html","id":"core-concept","dir":"Articles","previous_headings":"","what":"Core Concept","title":"Algorithms & Sub-Algorithms","text":"SDTM mappings defined algorithms transform collected (eCRF, eDT) source data target SDTM data model. Mapping algorithms backbone {sdtm.oak} - SDTM data transformation engine. Key Points: Algorithms can re-used across multiple SDTM domains. Algorithms pre-specified data collection standards MDR (applicable) facilitate automation. Programming language agnostic - concept rely specific programming language implementation. {sdtm.oak} team implemented R functions. example reusing algorithm across multiple domains, variables, also non-standard","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/algorithms.html","id":"list-of-algorithms","dir":"Articles","previous_headings":"","what":"List of Algorithms","title":"Algorithms & Sub-Algorithms","text":"release {sdtm.oak} supports following algorithms: assign_no_ct, assign_ct, hardcode_no_ct, hardcode_ct, assign_datetime, condition_add. Rest algorithms developed subsequent releases. following table provides brief description algorithm.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/algorithms.html","id":"sub-algorithms","dir":"Articles","previous_headings":"","what":"Sub-algorithms","title":"Algorithms & Sub-Algorithms","text":"{sdtm.oak} supports two levels defining algorithms. example, SDTM mappings certain action taken condition met. cases, primary algorithm checks condition, sub-algorithm executes mappings condition met. Currently, sub-algorithms must provided main algorithms. condition_add dataset_level algorithms can interchangeably used algorithms sub-algorithms seen (exhaustive list) permutation & combination algorithms & sub-algorithms creates endless possibilities accommodate different types mappings.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/cnd_df.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Conditioned Data Frames","text":"Conditioned data frames, cnd_df, powerful tool sdtm.oak package designed facilitate conditional transformations data frames. article explains create use conditioned data frames, particularly context SDTM domain derivations.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/cnd_df.html","id":"creating-conditioned-data-frames","dir":"Articles","previous_headings":"","what":"Creating Conditioned Data Frames","title":"Conditioned Data Frames","text":"conditioned data frame regular data frame extended logical vector cnd marks rows subsequent conditional transformations. condition_add() function used create conditioned data frames.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/cnd_df.html","id":"simple-example","dir":"Articles","previous_headings":"Creating Conditioned Data Frames","what":"Simple Example","title":"Conditioned Data Frames","text":"Consider simple data frame df: can create conditioned data frame rows x > 1 marked: , second third rows marked TRUE.","code":"(df <- tibble(x = 1L:3L, y = letters[1L:3L])) ## # A tibble: 3 × 2 ## x y ## ## 1 1 a ## 2 2 b ## 3 3 c (cnd_df <- condition_add(dat = df, x > 1L)) ## # A tibble: 3 × 2 ## # Cond. tbl: 2/1/0 ## x y ## ## 1 F 1 a ## 2 T 2 b ## 3 T 3 c"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/cnd_df.html","id":"usage-in-sdtm-domain-derivations","dir":"Articles","previous_headings":"","what":"Usage in SDTM Domain Derivations","title":"Conditioned Data Frames","text":"real power conditioned data frames manifests used functions assign_no_ct, assign_ct, hardcode_no_ct, hardcode_ct. functions perform derivations records match pattern TRUE values conditioned data frames.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/cnd_df.html","id":"example-with-concomitant-medications-cm-domain","dir":"Articles","previous_headings":"Usage in SDTM Domain Derivations","what":"Example with Concomitant Medications (CM) Domain","title":"Conditioned Data Frames","text":"Consider simplified dataset concomitant medications, want derive new variable CMGRPID (Concomitant Medication Group ID) based condition medication treatment (CMTRT) \"BENADRYL\". simplified raw Concomitant Medications data set (cm_raw): derive CMTRT variable use assign_no_ct() function map MDRAW variable CMTRT variable: create conditioned data frame target data set (tgt_dat), meaning create conditioned data frame rows CMTRT equal \"BENADRYL\" marked: Finally, derive CMGRPID variable conditionally. Using assign_no_ct(), derive CMGRPID indicates group ID medication, based conditioned target data set: Conditioned data frames sdtm.oak package provide flexible way perform conditional transformations data sets. marking specific rows transformation, users can efficiently derive SDTM variables, ensuring relevant records processed.","code":"cm_raw <- tibble::tibble( oak_id = seq_len(14L), raw_source = \"ConMed\", patient_number = c(375L, 375L, 376L, 377L, 377L, 377L, 377L, 378L, 378L, 378L, 378L, 379L, 379L, 379L), MDNUM = c(1L, 2L, 1L, 1L, 2L, 3L, 5L, 4L, 1L, 2L, 3L, 1L, 2L, 3L), MDRAW = c( \"BABY ASPIRIN\", \"CORTISPORIN\", \"ASPIRIN\", \"DIPHENHYDRAMINE HCL\", \"PARCETEMOL\", \"VOMIKIND\", \"ZENFLOX OZ\", \"AMITRYPTYLINE\", \"BENADRYL\", \"DIPHENHYDRAMINE HYDROCHLORIDE\", \"TETRACYCLINE\", \"BENADRYL\", \"SOMINEX\", \"ZQUILL\" ) ) cm_raw ## # A tibble: 14 × 5 ## oak_id raw_source patient_number MDNUM MDRAW ## ## 1 1 ConMed 375 1 BABY ASPIRIN ## 2 2 ConMed 375 2 CORTISPORIN ## 3 3 ConMed 376 1 ASPIRIN ## 4 4 ConMed 377 1 DIPHENHYDRAMINE HCL ## 5 5 ConMed 377 2 PARCETEMOL ## 6 6 ConMed 377 3 VOMIKIND ## 7 7 ConMed 377 5 ZENFLOX OZ ## 8 8 ConMed 378 4 AMITRYPTYLINE ## 9 9 ConMed 378 1 BENADRYL ## 10 10 ConMed 378 2 DIPHENHYDRAMINE HYDROCHLORIDE ## 11 11 ConMed 378 3 TETRACYCLINE ## 12 12 ConMed 379 1 BENADRYL ## 13 13 ConMed 379 2 SOMINEX ## 14 14 ConMed 379 3 ZQUILL tgt_dat <- assign_no_ct( tgt_var = \"CMTRT\", raw_dat = cm_raw, raw_var = \"MDRAW\" ) tgt_dat ## # A tibble: 14 × 4 ## oak_id raw_source patient_number CMTRT ## ## 1 1 ConMed 375 BABY ASPIRIN ## 2 2 ConMed 375 CORTISPORIN ## 3 3 ConMed 376 ASPIRIN ## 4 4 ConMed 377 DIPHENHYDRAMINE HCL ## 5 5 ConMed 377 PARCETEMOL ## 6 6 ConMed 377 VOMIKIND ## 7 7 ConMed 377 ZENFLOX OZ ## 8 8 ConMed 378 AMITRYPTYLINE ## 9 9 ConMed 378 BENADRYL ## 10 10 ConMed 378 DIPHENHYDRAMINE HYDROCHLORIDE ## 11 11 ConMed 378 TETRACYCLINE ## 12 12 ConMed 379 BENADRYL ## 13 13 ConMed 379 SOMINEX ## 14 14 ConMed 379 ZQUILL (cnd_tgt_dat <- condition_add(tgt_dat, CMTRT == \"BENADRYL\")) ## # A tibble: 14 × 4 ## # Cond. tbl: 2/12/0 ## oak_id raw_source patient_number CMTRT ## ## 1 F 1 ConMed 375 BABY ASPIRIN ## 2 F 2 ConMed 375 CORTISPORIN ## 3 F 3 ConMed 376 ASPIRIN ## 4 F 4 ConMed 377 DIPHENHYDRAMINE HCL ## 5 F 5 ConMed 377 PARCETEMOL ## 6 F 6 ConMed 377 VOMIKIND ## 7 F 7 ConMed 377 ZENFLOX OZ ## 8 F 8 ConMed 378 AMITRYPTYLINE ## 9 T 9 ConMed 378 BENADRYL ## 10 F 10 ConMed 378 DIPHENHYDRAMINE HYDROCHLORIDE ## 11 F 11 ConMed 378 TETRACYCLINE ## 12 T 12 ConMed 379 BENADRYL ## 13 F 13 ConMed 379 SOMINEX ## 14 F 14 ConMed 379 ZQUILL derived_tgt_dat <- assign_no_ct( tgt_dat = cnd_tgt_dat, tgt_var = \"CMGRPID\", raw_dat = cm_raw, raw_var = \"MDNUM\" ) derived_tgt_dat ## # A tibble: 14 × 5 ## oak_id raw_source patient_number CMTRT CMGRPID ## ## 1 1 ConMed 375 BABY ASPIRIN NA ## 2 2 ConMed 375 CORTISPORIN NA ## 3 3 ConMed 376 ASPIRIN NA ## 4 4 ConMed 377 DIPHENHYDRAMINE HCL NA ## 5 5 ConMed 377 PARCETEMOL NA ## 6 6 ConMed 377 VOMIKIND NA ## 7 7 ConMed 377 ZENFLOX OZ NA ## 8 8 ConMed 378 AMITRYPTYLINE NA ## 9 9 ConMed 378 BENADRYL 1 ## 10 10 ConMed 378 DIPHENHYDRAMINE HYDROCHLORIDE NA ## 11 11 ConMed 378 TETRACYCLINE NA ## 12 12 ConMed 379 BENADRYL 1 ## 13 13 ConMed 379 SOMINEX NA ## 14 14 ConMed 379 ZQUILL NA"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Creating an Events SDTM domain","text":"article describes creating Events SDTM domain using sdtm.oak package. Examples currently presented tested context CM domain.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"raw-data","dir":"Articles","previous_headings":"","what":"Raw data","title":"Creating an Events SDTM domain","text":"Raw datasets can exported EDC systems format collected. example used provides raw dataset Concomitant medications, collected data represented columns subject. example, Medication Name(MDRAW), Medication Start Date (MDBDR), Start Time (MDBTM), End Date (MDEDR), End time (MDETM), etc. represented columns.format commonly used EDC systems. raw dataset presented :","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"programming-workflow","dir":"Articles","previous_headings":"","what":"Programming workflow","title":"Creating an Events SDTM domain","text":"{sdtm.oak} process one raw dataset time. Similar raw datasets (example Concomitant medications (OID - cm_raw), Targeted Concomitant Medications (OID - cm_t_raw)) can stacked together processing. Read data Create oak_id_vars Read CT Map Topic Variable assign_no_ct assign_ct assign_datetime hardcode_ct condition_add hardcode_no_ct condition_add condition_add involving target domain condition_add involving raw dataset target domain Repeat Map Topic Map Rest Repeat steps different raw datasets proceeding steps. Create SDTM derived variables Add Labels Attributes","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"readdata","dir":"Articles","previous_headings":"Programming workflow","what":"Read in data","title":"Creating an Events SDTM domain","text":"Read raw datasets environment. example, raw dataset name cm_raw. Users can read package using code:","code":"cm_raw <- read.csv(system.file(\"raw_data/cm_raw_data.csv\", package = \"sdtm.oak\" ))"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"oakidvars","dir":"Articles","previous_headings":"Programming workflow","what":"Create oak_id_vars","title":"Creating an Events SDTM domain","text":"oak_id_vars crucial link raw datasets mapped SDTM domain. user derives SDTM variable, merged corresponding topic variable using oak_id_vars. {sdtm.oak}, variables oak_id, raw_source, patient_number considered oak_id_vars. three variables must added raw datasets. used multiple places programming. oak_id:- Type: numeric- Value: equal raw dataframe row number. raw_source:- Type: Character- Value: equal raw dataset (eCRF) name eDT dataset name. patient_number:- Type: numeric- Value: equal subject number CRF NonCRF data source. Read DM domain","code":"cm_raw <- cm_raw %>% generate_oak_id_vars( pat_var = \"PATNUM\", raw_src = \"cm_raw\" ) dm <- read.csv(system.file(\"raw_data/dm.csv\", package = \"sdtm.oak\" ))"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"readct","dir":"Articles","previous_headings":"Programming workflow","what":"Read in CT","title":"Creating an Events SDTM domain","text":"Controlled Terminology part SDTM specification prepared user. example, study controlled terminology name sdtm_ct.csv. Users can read package using code:","code":"study_ct <- read.csv(system.file(\"raw_data/sdtm_ct.csv\", package = \"sdtm.oak\" ))"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"maptopic","dir":"Articles","previous_headings":"Programming workflow","what":"Map Topic Variable","title":"Creating an Events SDTM domain","text":"topic variable mapped first step mapping process. primary variable SDTM domain. rest variables add definition topic variable. example, topic variable CMTRT. mapped raw dataset column MDRAW. mapping logic Map collected value cm_raw dataset MDRAW variable CM.CMTRT. mapping involve controlled terminology. assign_no_ct function used mapping. topic variable mapped, Qualifier, Identifier, Timing variables can mapped.","code":"cm <- # Map topic variable assign_no_ct( raw_dat = cm_raw, raw_var = \"MDRAW\", tgt_var = \"CMTRT\" )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"maprest","dir":"Articles","previous_headings":"Programming workflow","what":"Map Rest of the Variables","title":"Creating an Events SDTM domain","text":"Qualifiers, Identifiers, Timing Variables can mapped order. example, map variable one one demonstrate different mapping algorithms.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"assign_no_ct","dir":"Articles","previous_headings":"Programming workflow > Map Rest of the Variables","what":"assign_no_ct","title":"Creating an Events SDTM domain","text":"mapping logic CMGRPID Map collected value cm_raw dataset MDNUM variable CM.CMGRPID. CMGRPID added corresponding CMTRT based ‘oak_id_vars’. calling function, parameter ‘id_vars = oak_id_vars()’ matches raw dataset ‘oak_id_vars’ ‘oak_id_vars’ cm domain created previous step. ’s important note ‘oak_id_vars’ can extended include user-defined variables. cases, three variables suffice.","code":"cm <- cm %>% # Map CMGRPID assign_no_ct( raw_dat = cm_raw, raw_var = \"MDNUM\", tgt_var = \"CMGRPID\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"assign_ct","dir":"Articles","previous_headings":"Programming workflow > Map Rest of the Variables","what":"assign_ct","title":"Creating an Events SDTM domain","text":"mapping logic CMDOSU Map collected value cm_raw dataset DOSU variable CM.CMDOSU. controlled terminology used map collected value standard value. assign_ct right algorithm perform mapping.","code":"cm <- cm %>% # Map qualifier CMDOSU assign_ct( raw_dat = cm_raw, raw_var = \"DOSU\", tgt_var = \"CMDOSU\", ct_spec = study_ct, ct_clst = \"C71620\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"assign_datetime","dir":"Articles","previous_headings":"Programming workflow > Map Rest of the Variables","what":"assign_datetime","title":"Creating an Events SDTM domain","text":"mapping logic CMSTDTC Map collected value cm_raw dataset MDBDR (start date) variable MDBTM (start time) CM.CMSTDTC. collected date value format ‘dd mmm yyyy’. collected time value ‘H”M’ format. assign_datetime function used map collected value ISO8601 format.","code":"cm <- cm %>% # Map CMSTDTC. This function calls create_iso8601 assign_datetime( raw_dat = cm_raw, raw_var = c(\"MDBDR\", \"MDBTM\"), tgt_var = \"CMSTDTC\", raw_fmt = c(list(c(\"d-m-y\", \"dd mmm yyyy\")), \"H:M\"), raw_unk = c(\"UN\", \"UNK\"), id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"hardcode_ct","dir":"Articles","previous_headings":"Programming workflow > Map Rest of the Variables","what":"hardcode_ct and condition_add","title":"Creating an Events SDTM domain","text":"mapping logic CMSTRTPT follows: collected value raw variable MDPRIOR raw dataset cm_raw equals 1, CM.CMSTRTPT == ''. hardcode_ct function used map CMSTRTPT involves hardcoding specific value SDTM variable controlled terminology. condition_add function filters raw dataset based particular condition, hardcode_ct function performs mapping. two functions used together, condition_add function first filters raw dataset based specified condition. Next, filtered dataset passed hardcode_ct function assign appropriate value. example illustrates hardcode_ct algorithm functions sub-algorithm condition_add. condition_add function adds additional metadata records raw dataset meets condition. Refer function documentation details. hardcode_ct function uses additional metadata find records meet criteria map accordingly.","code":"cm <- cm %>% # Map qualifier CMSTRTPT Annotation text is If MDPRIOR == 1 then CM.CMSTRTPT = 'BEFORE' hardcode_ct( raw_dat = condition_add(cm_raw, MDPRIOR == \"1\"), raw_var = \"MDPRIOR\", tgt_var = \"CMSTRTPT\", tgt_val = \"BEFORE\", ct_spec = study_ct, ct_clst = \"C66728\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"hardcode_no_ct","dir":"Articles","previous_headings":"Programming workflow > Map Rest of the Variables","what":"hardcode_no_ct and condition_add","title":"Creating an Events SDTM domain","text":"mapping logic CMSTTPT follows: collected value raw variable MDPRIOR raw dataset cm_raw equals 1, CM.CMSTTPT == 'SCREENING'. hardcode_no_ct function used map CMSTTPT involves hardcoding specific value SDTM variable without controlled terminology. condition_add function filters raw dataset based particular condition, hardcode_no_ct function performs mapping.","code":"cm <- cm %>% # Map qualifier CMSTTPT Annotation text is If MDPRIOR == 1 then CM.CMSTTPT = 'SCREENING' hardcode_no_ct( raw_dat = condition_add(cm_raw, MDPRIOR == \"1\"), raw_var = \"MDPRIOR\", tgt_var = \"CMSTTPT\", tgt_val = \"SCREENING\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"condition_add_tar","dir":"Articles","previous_headings":"Programming workflow > Map Rest of the Variables","what":"condition_add involving target domain","title":"Creating an Events SDTM domain","text":"mapping CMSTRTPT CMSTTTPT, condition_add function used raw dataset. mapping, can explore use condition_add add filter condition based target SDTM variable. mapping logic CMDOSFRQ CMTRT null, map collected value raw dataset cm_raw raw variable MDFRQ CMDOSFRQ. may may represent valid SDTM mapping actual study, can used example. mapping, condition_add function filters cm domain created previous step adds metadata records meets condition. assign_ct function uses additional metadata find records meet criteria map accordingly. Remember use additional curly braces function call using condition_add function target dataset. necessary input target dataset represented . passed previous step using {magrittr} pipe operator. Currently, limitation using nested function call . reference one input parameters, recommended approach overcome . placeholder . use {magrittr} pipe %>% operator. encourage using . {magrittr} pipe %>% operator using {sdtm.oak} functions. Another way achieve outcome moving ‘condition_by’ call one level, illustrated : required use {magrittr} pipe %>% curly braces case.","code":"cm <- cm %>% # Map qualifier CMDOSFRQ Annotation text is If CMTRT is not null then map # the collected value in raw dataset cm_raw and raw variable MDFRQ to CMDOSFRQ { assign_ct( raw_dat = cm_raw, raw_var = \"MDFRQ\", tgt_dat = condition_add(., !is.na(CMTRT)), tgt_var = \"CMDOSFRQ\", ct_spec = study_ct, ct_clst = \"C66728\", id_vars = oak_id_vars() ) } cm <- cm %>% condition_add(!is.na(CMTRT)) %>% assign_ct( raw_dat = cm_raw, raw_var = \"DOSU\", tgt_var = \"CMDOSU\", ct_spec = study_ct, ct_clst = \"C71620\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"condition_add_raw_tar","dir":"Articles","previous_headings":"Programming workflow > Map Rest of the Variables","what":"condition_add involving raw dataset and target domain","title":"Creating an Events SDTM domain","text":"mapping, can explore use condition_add add filter condition based target SDTM variable. mapping logic CMMODIFY collected value MODIFY cm_raw different CM.CMTRT assign collected value CMMODIFY CM domain (CM.CMMODIFY). assign_no_ct function used map CMMODIFY involves mapping collected value SDTM variable without controlled terminology. condition_add function filters raw dataset & target dataset based particular condition, assign_no_ct function performs mapping. Another way achieve outcome moving ‘condition_by’ call one level, illustrated : required use {magrittr} pipe %>% curly braces case. Now, complete mapping rest SDTM variables.","code":"cm <- cm %>% # Map CMMODIFY Annotation text If collected value in MODIFY in cm_raw is # different to CM.CMTRT then assign the collected value to CMMODIFY in # CM domain (CM.CMMODIFY) { assign_no_ct( raw_dat = cm_raw, raw_var = \"MODIFY\", tgt_dat = condition_add(., MODIFY != CMTRT, .dat2 = cm_raw), tgt_var = \"CMMODIFY\", id_vars = oak_id_vars() ) } cm <- cm %>% condition_add(MODIFY != CMTRT, .dat2 = cm_raw) %>% assign_no_ct( raw_dat = cm_raw, raw_var = \"MODIFY\", tgt_var = \"CMMODIFY\", id_vars = oak_id_vars() ) cm <- cm %>% # Map CMINDC as the collected value in MDIND to CM.CMINDC assign_no_ct( raw_dat = cm_raw, raw_var = \"MDIND\", tgt_var = \"CMINDC\", id_vars = oak_id_vars() ) %>% # Map CMENDTC as the collected value in MDEDR and MDETM to CM.CMENDTC. # This function calls create_iso8601 assign_datetime( raw_dat = cm_raw, raw_var = c(\"MDEDR\", \"MDETM\"), tgt_var = \"CMENDTC\", raw_fmt = c(\"d-m-y\", \"H:M\"), raw_unk = c(\"UN\", \"UNK\") ) %>% # Map qualifier CMENRTPT as If MDONG == 1 then CM.CMENRTPT = 'ONGOING' hardcode_ct( raw_dat = condition_add(cm_raw, MDONG == \"1\"), raw_var = \"MDONG\", tgt_var = \"CMENRTPT\", tgt_val = \"ONGOING\", ct_spec = study_ct, ct_clst = \"C66728\", id_vars = oak_id_vars() ) %>% # Map qualifier CMENTPT as If MDONG == 1 then CM.CMENTPT = 'DATE OF LAST ASSESSMENT' hardcode_no_ct( raw_dat = condition_add(cm_raw, MDONG == \"1\"), raw_var = \"MDONG\", tgt_var = \"CMENTPT\", tgt_val = \"DATE OF LAST ASSESSMENT\", id_vars = oak_id_vars() ) %>% # Map qualifier CMDOS as If collected value in raw_var DOS is numeric then CM.CMDOSE assign_no_ct( raw_dat = condition_add(cm_raw, is.numeric(DOS)), raw_var = \"DOS\", tgt_var = \"CMDOS\", id_vars = oak_id_vars() ) %>% # Map qualifier CMDOS as If collected value in raw_var DOS is character then CM.CMDOSTXT assign_no_ct( raw_dat = condition_add(cm_raw, is.character(DOS)), raw_var = \"DOS\", tgt_var = \"CMDOSTXT\", id_vars = oak_id_vars() ) %>% # Map qualifier CMDOSU as the collected value in the cm_raw dataset DOSU variable to CM.CMDOSU assign_ct( raw_dat = cm_raw, raw_var = \"DOSU\", tgt_var = \"CMDOSU\", ct_spec = study_ct, ct_clst = \"C71620\", id_vars = oak_id_vars() ) %>% # Map qualifier CMDOSFRM as the collected value in the cm_raw dataset MDFORM variable to CM.CMDOSFRM assign_ct( raw_dat = cm_raw, raw_var = \"MDFORM\", tgt_var = \"CMDOSFRM\", ct_spec = study_ct, ct_clst = \"C66726\", id_vars = oak_id_vars() ) %>% # Map CMROUTE as the collected value in the cm_raw dataset MDRTE variable to CM.CMROUTE assign_ct( raw_dat = cm_raw, raw_var = \"MDRTE\", tgt_var = \"CMROUTE\", ct_spec = study_ct, ct_clst = \"C66729\", id_vars = oak_id_vars() ) %>% # Map qualifier CMPROPH as If MDPROPH == 1 then CM.CMPROPH = 'Y' hardcode_ct( raw_dat = condition_add(cm_raw, MDPROPH == \"1\"), raw_var = \"MDPROPH\", tgt_var = \"CMPROPH\", tgt_val = \"Y\", ct_spec = study_ct, ct_clst = \"C66742\", id_vars = oak_id_vars() ) %>% # Map CMDRG as the collected value in the cm_raw dataset CMDRG variable to CM.CMDRG assign_no_ct( raw_dat = cm_raw, raw_var = \"CMDRG\", tgt_var = \"CMDRG\", id_vars = oak_id_vars() ) %>% # Map CMDRGCD as the collected value in the cm_raw dataset CMDRGCD variable to CM.CMDRGCD assign_no_ct( raw_dat = cm_raw, raw_var = \"CMDRGCD\", tgt_var = \"CMDRGCD\", id_vars = oak_id_vars() ) %>% # Map CMDECOD as the collected value in the cm_raw dataset CMDECOD variable to CM.CMDECOD assign_no_ct( raw_dat = cm_raw, raw_var = \"CMDECOD\", tgt_var = \"CMDECOD\", id_vars = oak_id_vars() ) %>% # Map CMPNCD as the collected value in the cm_raw dataset CMPNCD variable to CM.CMPNCD assign_no_ct( raw_dat = cm_raw, raw_var = \"CMPNCD\", tgt_var = \"CMPNCD\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"repeatsteps","dir":"Articles","previous_headings":"Programming workflow","what":"Repeat Map Topic and Map Rest","title":"Creating an Events SDTM domain","text":"one topic variable raw data source, additional topic variable mappings. Users can proceed next step. required one topic variable map.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"derivedvars","dir":"Articles","previous_headings":"Programming workflow","what":"Create SDTM derived variables","title":"Creating an Events SDTM domain","text":"SDTM derived variables SDTM mapping applicable records cm dataset produced previous step cam created now. example, create CMSEQ variable. mapping logic Create sequence number record CM domain.","code":"cm <- cm %>% # The below mappings are applicable to all the records in the cm domain, # hence can be derived using mutate statement. dplyr::mutate( STUDYID = \"test_study\", DOMAIN = \"CM\", CMCAT = \"GENERAL CONMED\", USUBJID = paste0(\"test_study\", \"-\", cm_raw$PATNUM) ) %>% # derive sequence number # derive_seq(tgt_var = \"CMSEQ\", # rec_vars= c(\"USUBJID\", \"CMGRPID\")) %>% derive_study_day( sdtm_in = ., dm_domain = dm, tgdt = \"CMENDTC\", refdt = \"RFXSTDTC\", study_day_var = \"CMENDY\" ) %>% derive_study_day( sdtm_in = ., dm_domain = dm, tgdt = \"CMSTDTC\", refdt = \"RFXSTDTC\", study_day_var = \"CMSTDY\" ) %>% # Add code for derive Baseline flag. dplyr::select(\"STUDYID\", \"DOMAIN\", \"USUBJID\", everything())"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/events_domain.html","id":"attributes","dir":"Articles","previous_headings":"Programming workflow","what":"Add Labels and Attributes","title":"Creating an Events SDTM domain","text":"Yet developed.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Creating an Findings SDTM domain","text":"article describes create Findings SDTM domain using {sdtm.oak} package. Examples currently presented tested context VS domain. reading article, recommended users review “Creating Events Domain” article, provides detailed explanation various concepts {sdtm.oak}, oak_id_vars, condition_add, etc. also offers guidance mapping algorithms functions use different mappings provides detailed explanation mapping algorithms functions work. article, dive directly programming provide explanation required.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"programming-workflow","dir":"Articles","previous_headings":"","what":"Programming workflow","title":"Creating an Findings SDTM domain","text":"{sdtm.oak} process one raw dataset time. Similar raw datasets (example Vital Signs - Screening (OID - vs_raw), Vital Signs - Treatment (OID - vs_t_raw)) can stacked together processing. Read data Create oak_id_vars Read CT Map Topic Variable Map Rest Variables Repeat Map Topic Map Rest Repeat steps different raw datasets proceeding steps. Create SDTM derived variables Add Labels Attributes","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"readdata","dir":"Articles","previous_headings":"Programming workflow","what":"Read in data","title":"Creating an Findings SDTM domain","text":"Read raw datasets environment. example, raw dataset name vs_raw. Users can read package using code:","code":"vs_raw <- read.csv(system.file(\"raw_data/vitals_raw_data.csv\", package = \"sdtm.oak\" ))"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"oakidvars","dir":"Articles","previous_headings":"Programming workflow","what":"Create oak_id_vars","title":"Creating an Findings SDTM domain","text":"Read DM domain","code":"vs_raw <- vs_raw %>% generate_oak_id_vars( pat_var = \"PATNUM\", raw_src = \"vitals\" )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"readct","dir":"Articles","previous_headings":"Programming workflow","what":"Read in CT","title":"Creating an Findings SDTM domain","text":"Controlled Terminology part SDTM specification prepared user. example, study controlled terminology name sdtm_ct.csv. Users can read package using code:","code":"study_ct <- read.csv(system.file(\"raw_data/sdtm_ct.csv\", package = \"sdtm.oak\" ))"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"maptopic","dir":"Articles","previous_headings":"Programming workflow","what":"Map Topic Variable","title":"Creating an Findings SDTM domain","text":"raw dataset multiple topic variables. Lets start first topic variable. Map topic variable SYSBP raw variable SYS_BP.","code":"# Map topic variable SYSBP and its qualifiers. vs_sysbp <- hardcode_ct( raw_dat = vs_raw, raw_var = \"SYS_BP\", tgt_var = \"VSTESTCD\", tgt_val = \"SYSBP\", ct_spec = study_ct, ct_clst = \"C66741\" ) %>% # Filter for records where VSTESTCD is not empty. # Only these records need qualifier mappings. dplyr::filter(!is.na(.data$VSTESTCD))"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"maprest","dir":"Articles","previous_headings":"Programming workflow","what":"Map Rest of the Variables","title":"Creating an Findings SDTM domain","text":"Map rest variables applicable topic variable SYSBP. can include qualifiers, identifier timing variables.","code":"# Map topic variable SYSBP and its qualifiers. vs_sysbp <- vs_sysbp %>% # Map VSTEST using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"SYS_BP\", tgt_var = \"VSTEST\", tgt_val = \"Systolic Blood Pressure\", ct_spec = study_ct, ct_clst = \"C67153\", id_vars = oak_id_vars() ) %>% # Map VSORRES using assign_no_ct algorithm assign_no_ct( raw_dat = vs_raw, raw_var = \"SYS_BP\", tgt_var = \"VSORRES\", id_vars = oak_id_vars() ) %>% # Map VSORRESU using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"SYS_BP\", tgt_var = \"VSORRESU\", tgt_val = \"mmHg\", ct_spec = study_ct, ct_clst = \"C66770\", id_vars = oak_id_vars() ) %>% # Map VSPOS using assign_ct algorithm assign_ct( raw_dat = vs_raw, raw_var = \"SUBPOS\", tgt_var = \"VSPOS\", ct_spec = study_ct, ct_clst = \"C71148\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"repeatsteps","dir":"Articles","previous_headings":"Programming workflow","what":"Repeat Map Topic and Map Rest","title":"Creating an Findings SDTM domain","text":"raw data source topic variables DIABP, PULSE, RESP, TEMP, OXYSAT, VSALL corresponding qualifiers. Repeat mapping topic qualifiers topic variable. Now topic variable qualifier mappings complete, combine datasets proceed mapping qualifiers, identifiers timing variables applicable topic variables.","code":"# Map topic variable DIABP and its qualifiers. vs_diabp <- hardcode_ct( raw_dat = vs_raw, raw_var = \"DIA_BP\", tgt_var = \"VSTESTCD\", tgt_val = \"DIABP\", ct_spec = study_ct, ct_clst = \"C66741\" ) %>% dplyr::filter(!is.na(.data$VSTESTCD)) %>% # Map VSTEST using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"DIA_BP\", tgt_var = \"VSTEST\", tgt_val = \"Diastolic Blood Pressure\", ct_spec = study_ct, ct_clst = \"C67153\", id_vars = oak_id_vars() ) %>% # Map VSORRES using assign_no_ct algorithm assign_no_ct( raw_dat = vs_raw, raw_var = \"DIA_BP\", tgt_var = \"VSORRES\", id_vars = oak_id_vars() ) %>% # Map VSORRESU using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"DIA_BP\", tgt_var = \"VSORRESU\", tgt_val = \"mmHg\", ct_spec = study_ct, ct_clst = \"C66770\", id_vars = oak_id_vars() ) %>% # Map VSPOS using assign_ct algorithm assign_ct( raw_dat = vs_raw, raw_var = \"SUBPOS\", tgt_var = \"VSPOS\", ct_spec = study_ct, ct_clst = \"C71148\", id_vars = oak_id_vars() ) # Map topic variable PULSE and its qualifiers. vs_pulse <- hardcode_ct( raw_dat = vs_raw, raw_var = \"PULSE\", tgt_var = \"VSTESTCD\", tgt_val = \"PULSE\", ct_spec = study_ct, ct_clst = \"C66741\" ) %>% dplyr::filter(!is.na(.data$VSTESTCD)) %>% # Map VSTEST using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"PULSE\", tgt_var = \"VSTEST\", tgt_val = \"Pulse Rate\", ct_spec = study_ct, ct_clst = \"C67153\", id_vars = oak_id_vars() ) %>% # Map VSORRES using assign_no_ct algorithm assign_no_ct( raw_dat = vs_raw, raw_var = \"PULSE\", tgt_var = \"VSORRES\", id_vars = oak_id_vars() ) %>% # Map VSORRESU using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"PULSE\", tgt_var = \"VSORRESU\", tgt_val = \"beats/min\", ct_spec = study_ct, ct_clst = \"C66770\", id_vars = oak_id_vars() ) # Map topic variable RESP from the raw variable RESPRT and its qualifiers. vs_resp <- hardcode_ct( raw_dat = vs_raw, raw_var = \"RESPRT\", tgt_var = \"VSTESTCD\", tgt_val = \"RESP\", ct_spec = study_ct, ct_clst = \"C66741\" ) %>% dplyr::filter(!is.na(.data$VSTESTCD)) %>% # Map VSTEST using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"RESPRT\", tgt_var = \"VSTEST\", tgt_val = \"Respiratory Rate\", ct_spec = study_ct, ct_clst = \"C67153\", id_vars = oak_id_vars() ) %>% # Map VSORRES using assign_no_ct algorithm assign_no_ct( raw_dat = vs_raw, raw_var = \"RESPRT\", tgt_var = \"VSORRES\", id_vars = oak_id_vars() ) %>% # Map VSORRESU using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"RESPRT\", tgt_var = \"VSORRESU\", tgt_val = \"breaths/min\", ct_spec = study_ct, ct_clst = \"C66770\", id_vars = oak_id_vars() ) # Map topic variable TEMP from raw variable TEMP and its qualifiers. vs_temp <- hardcode_ct( raw_dat = vs_raw, raw_var = \"TEMP\", tgt_var = \"VSTESTCD\", tgt_val = \"TEMP\", ct_spec = study_ct, ct_clst = \"C66741\" ) %>% dplyr::filter(!is.na(.data$VSTESTCD)) %>% # Map VSTEST using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"TEMP\", tgt_var = \"VSTEST\", tgt_val = \"Temperature\", ct_spec = study_ct, ct_clst = \"C67153\", id_vars = oak_id_vars() ) %>% # Map VSORRES using assign_no_ct algorithm assign_no_ct( raw_dat = vs_raw, raw_var = \"TEMP\", tgt_var = \"VSORRES\", id_vars = oak_id_vars() ) %>% # Map VSORRESU using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"TEMP\", tgt_var = \"VSORRESU\", tgt_val = \"C\", ct_spec = study_ct, ct_clst = \"C66770\", id_vars = oak_id_vars() ) %>% # Map VSLOC from TEMPLOC using assign_ct assign_ct( raw_dat = vs_raw, raw_var = \"TEMPLOC\", tgt_var = \"VSLOC\", ct_spec = study_ct, ct_clst = \"C74456\", id_vars = oak_id_vars() ) # Map topic variable OXYSAT from raw variable OXY_SAT and its qualifiers. vs_oxysat <- hardcode_ct( raw_dat = vs_raw, raw_var = \"OXY_SAT\", tgt_var = \"VSTESTCD\", tgt_val = \"OXYSAT\", ct_spec = study_ct, ct_clst = \"C66741\" ) %>% dplyr::filter(!is.na(.data$VSTESTCD)) %>% # Map VSTEST using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"OXY_SAT\", tgt_var = \"VSTEST\", tgt_val = \"Oxygen Saturation\", ct_spec = study_ct, ct_clst = \"C67153\", id_vars = oak_id_vars() ) %>% # Map VSORRES using assign_no_ct algorithm assign_no_ct( raw_dat = vs_raw, raw_var = \"OXY_SAT\", tgt_var = \"VSORRES\", id_vars = oak_id_vars() ) %>% # Map VSORRESU using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"OXY_SAT\", tgt_var = \"VSORRESU\", tgt_val = \"%\", ct_spec = study_ct, ct_clst = \"C66770\", id_vars = oak_id_vars() ) %>% # Map VSLAT using assign_ct from raw variable LAT assign_ct( raw_dat = vs_raw, raw_var = \"LAT\", tgt_var = \"VSLAT\", ct_spec = study_ct, ct_clst = \"C99073\", id_vars = oak_id_vars() ) %>% # Map VSLOC using assign_ct from raw variable LOC assign_ct( raw_dat = vs_raw, raw_var = \"LOC\", tgt_var = \"VSLOC\", ct_spec = study_ct, ct_clst = \"C74456\", id_vars = oak_id_vars() ) # Map topic variable VSALL from raw variable ASMNTDN with the logic if ASMNTDN == 1 then VSTESTCD = VSALL vs_vsall <- hardcode_ct( raw_dat = condition_add(vs_raw, ASMNTDN == 1L), raw_var = \"ASMNTDN\", tgt_var = \"VSTESTCD\", tgt_val = \"VSALL\", ct_spec = study_ct, ct_clst = \"C66741\" ) %>% dplyr::filter(!is.na(.data$VSTESTCD)) %>% # Map VSTEST using hardcode_ct algorithm hardcode_ct( raw_dat = vs_raw, raw_var = \"ASMNTDN\", tgt_var = \"VSTEST\", tgt_val = \"Vital Signs\", ct_spec = study_ct, ct_clst = \"C67153\", id_vars = oak_id_vars() ) # Combine all the topic variables into a single data frame and map qualifiers # applicable to all topic variables vs <- dplyr::bind_rows( vs_vsall, vs_sysbp, vs_diabp, vs_pulse, vs_resp, vs_temp, vs_oxysat ) %>% # Map qualifiers common to all topic variables # Map VSDTC using assign_ct algorithm assign_datetime( raw_dat = vs_raw, raw_var = c(\"VTLD\", \"VTLTM\"), tgt_var = \"VSDTC\", raw_fmt = c(list(c(\"d-m-y\", \"dd-mmm-yyyy\")), \"H:M\") ) %>% # Map VSTPT from TMPTC using assign_ct assign_ct( raw_dat = vs_raw, raw_var = \"TMPTC\", tgt_var = \"VSTPT\", ct_spec = study_ct, ct_clst = \"TPT\", id_vars = oak_id_vars() ) %>% # Map VSTPTNUM from TMPTC using assign_ct assign_ct( raw_dat = vs_raw, raw_var = \"TMPTC\", tgt_var = \"VSTPTNUM\", ct_spec = study_ct, ct_clst = \"TPTNUM\", id_vars = oak_id_vars() ) %>% # Map VISIT from INSTANCE using assign_ct assign_ct( raw_dat = vs_raw, raw_var = \"INSTANCE\", tgt_var = \"VISIT\", ct_spec = study_ct, ct_clst = \"VISIT\", id_vars = oak_id_vars() ) %>% # Map VISITNUM from INSTANCE using assign_ct assign_ct( raw_dat = vs_raw, raw_var = \"INSTANCE\", tgt_var = \"VISITNUM\", ct_spec = study_ct, ct_clst = \"VISITNUM\", id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"derivedvars","dir":"Articles","previous_headings":"Programming workflow","what":"Create SDTM derived variables","title":"Creating an Findings SDTM domain","text":"Create derived variables applicable topic variables.","code":"vs <- vs %>% dplyr::mutate( STUDYID = \"test_study\", DOMAIN = \"VS\", VSCAT = \"VITAL SIGNS\", USUBJID = paste0(\"test_study\", \"-\", .data$patient_number) ) %>% # derive_seq(tgt_var = \"VSSEQ\", # rec_vars= c(\"USUBJID\", \"VSTRT\")) %>% derive_study_day( sdtm_in = ., dm_domain = dm, tgdt = \"VSDTC\", refdt = \"RFXSTDTC\", study_day_var = \"VSDY\" ) %>% dplyr::select(\"STUDYID\", \"DOMAIN\", \"USUBJID\", everything())"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/findings_domain.html","id":"attributes","dir":"Articles","previous_headings":"Programming workflow","what":"Add Labels and Attributes","title":"Creating an Findings SDTM domain","text":"Yet developed.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/iso_8601.html","id":"introduction","dir":"Articles","previous_headings":"","what":"Introduction","title":"Converting dates, times or date-times to ISO 8601","text":"perform conversion ISO 8601 format need pass two key arguments: least one vector dates, times, date-times character type; date/time format via .format parameter instructs create_iso8601() date/time components expect. default .format parameter understands reserved characters: \"y\" year \"m\" month \"d\" day \"H\" hours \"M\" minutes \"S\" seconds Besides character vectors dates times, may also pass single vector date-times, provided adjust format:","code":"create_iso8601(\"2000 01 05\", .format = \"y m d\") #> [1] \"2000-01-05\" create_iso8601(\"22:35:05\", .format = \"H:M:S\") #> [1] \"-----T22:35:05\" create_iso8601(\"2000-01-05 22:35:05\", .format = \"y-m-d H:M:S\") #> [1] \"2000-01-05T22:35:05\""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/iso_8601.html","id":"multiple-inputs","dir":"Articles","previous_headings":"","what":"Multiple inputs","title":"Converting dates, times or date-times to ISO 8601","text":"dates times separate vectors need pass format vector: addition, like R functions take vectors input, create_iso8601() vectorized: number elements inputs match get error: can combine individual date time components coming separate inputs; contrived example year, month day together, hour, minute: .format argument must always named; otherwise, treated one inputs interpreted missing.","code":"create_iso8601(\"2000-01-05\", \"22:35:05\", .format = c(\"y-m-d\", \"H:M:S\")) #> [1] \"2000-01-05T22:35:05\" date <- c(\"2000-01-05\", \"2001-12-25\", \"1980-06-18\", \"1979-09-07\") time <- c(\"00:12:21\", \"22:35:05\", \"03:00:15\", \"07:09:00\") create_iso8601(date, time, .format = c(\"y-m-d\", \"H:M:S\")) #> [1] \"2000-01-05T00:12:21\" \"2001-12-25T22:35:05\" \"1980-06-18T03:00:15\" #> [4] \"1979-09-07T07:09:00\" date <- c(\"2000-01-05\", \"2001-12-25\", \"1980-06-18\", \"1979-09-07\") time <- \"00:12:21\" try(create_iso8601(date, time, .format = c(\"y-m-d\", \"H:M:S\"))) #> Error in create_iso8601(date, time, .format = c(\"y-m-d\", \"H:M:S\")) : #> All vectors in `...` must be of the same length. year <- c(\"99\", \"84\", \"00\", \"80\", \"79\", \"1944\", \"1953\") month_and_day <- c(\"jan 1\", \"apr 04\", \"mar 06\", \"jun 18\", \"sep 07\", \"sep 13\", \"sep 14\") hour <- c(\"12\", \"13\", \"05\", \"23\", \"16\", \"16\", \"19\") min <- c(\"0\", \"60\", \"59\", \"42\", \"44\", \"10\", \"13\") create_iso8601(year, month_and_day, hour, min, .format = c(\"y\", \"m d\", \"H\", \"M\")) #> [1] \"1999-01-01T12:00\" \"1984-04-04T13:60\" \"2000-03-06T05:59\" \"1980-06-18T23:42\" #> [5] \"1979-09-07T16:44\" \"1944-09-13T16:10\" \"1953-09-14T19:13\" try(create_iso8601(\"2000-01-05\", \"y-m-d\")) #> Error in create_iso8601(\"2000-01-05\", \"y-m-d\") : #> argument \".format\" is missing, with no default"},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/iso_8601.html","id":"format-variations","dir":"Articles","previous_headings":"","what":"Format variations","title":"Converting dates, times or date-times to ISO 8601","text":".format parameter can easily accommodate variations format inputs: Individual components may come different order, adjust format accordingly: individual characters given format taken strictly, e.g. number spaces matters: format can include regular expressions though: default, streak reserved characters treated one provided, formats equivalent:","code":"create_iso8601(\"2000-01-05\", .format = \"y-m-d\") #> [1] \"2000-01-05\" create_iso8601(\"2000 01 05\", .format = \"y m d\") #> [1] \"2000-01-05\" create_iso8601(\"2000/01/05\", .format = \"y/m/d\") #> [1] \"2000-01-05\" create_iso8601(\"2000 01 05\", .format = \"y m d\") #> [1] \"2000-01-05\" create_iso8601(\"05 01 2000\", .format = \"d m y\") #> [1] \"2000-01-05\" create_iso8601(\"01 05, 2000\", .format = \"m d, y\") #> [1] \"2000-01-05\" date <- c(\"2000 01 05\", \"2000 01 05\", \"2000 01 05\", \"2000 01 05\") create_iso8601(date, .format = \"y m d\") #> [1] \"2000-01-05\" NA NA NA create_iso8601(date, .format = \"y m d\") #> [1] NA \"2000-01-05\" NA NA create_iso8601(date, .format = \"y m d\") #> [1] NA NA \"2000-01-05\" NA create_iso8601(date, .format = \"y m d\") #> [1] NA NA NA \"2000-01-05\" create_iso8601(date, .format = \"y\\\\s+m\\\\s+d\") #> [1] \"2000-01-05\" \"2000-01-05\" \"2000-01-05\" \"2000-01-05\" date <- c(\"2000-01-05\", \"2001-12-25\", \"1980-06-18\", \"1979-09-07\") time <- c(\"00:12:21\", \"22:35:05\", \"03:00:15\", \"07:09:00\") create_iso8601(date, time, .format = c(\"y-m-d\", \"H:M:S\")) #> [1] \"2000-01-05T00:12:21\" \"2001-12-25T22:35:05\" \"1980-06-18T03:00:15\" #> [4] \"1979-09-07T07:09:00\" create_iso8601(date, time, .format = c(\"yyyy-mm-dd\", \"HH:MM:SS\")) #> [1] \"2000-01-05T00:12:21\" \"2001-12-25T22:35:05\" \"1980-06-18T03:00:15\" #> [4] \"1979-09-07T07:09:00\" create_iso8601(date, time, .format = c(\"yyyyyyyy-m-dddddd\", \"H:MMMMM:SSSS\")) #> [1] \"2000-01-05T00:12:21\" \"2001-12-25T22:35:05\" \"1980-06-18T03:00:15\" #> [4] \"1979-09-07T07:09:00\""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/iso_8601.html","id":"multiple-alternative-formats","dir":"Articles","previous_headings":"","what":"Multiple alternative formats","title":"Converting dates, times or date-times to ISO 8601","text":"input vector contains values varying formats, single format may adequate encompass variations. situations, ’s advisable list multiple alternative formats. approach ensures format tried sequentially one matches data vector. Consider order supply formats, can significant. multiple formats potentially match, sequence determines format applied first. Note passing alternative formats, .format argument must list whose length matches number inputs.","code":"date <- c(\"2000/01/01\", \"2000-01-02\", \"2000 01 03\", \"2000/01/04\") create_iso8601(date, .format = \"y-m-d\") #> [1] NA \"2000-01-02\" NA NA create_iso8601(date, .format = \"y m d\") #> [1] NA NA \"2000-01-03\" NA create_iso8601(date, .format = \"y/m/d\") #> [1] \"2000-01-01\" NA NA \"2000-01-04\" create_iso8601(date, .format = list(c(\"y-m-d\", \"y m d\", \"y/m/d\"))) #> [1] \"2000-01-01\" \"2000-01-02\" \"2000-01-03\" \"2000-01-04\" create_iso8601(\"07 04 2000\", .format = list(c(\"d m y\", \"m d y\"))) #> [1] \"2000-04-07\" create_iso8601(\"07 04 2000\", .format = list(c(\"m d y\", \"d m y\"))) #> [1] \"2000-07-04\""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/iso_8601.html","id":"parsing-of-date-or-time-components","dir":"Articles","previous_headings":"","what":"Parsing of date or time components","title":"Converting dates, times or date-times to ISO 8601","text":"default, date time components parsed follows: year: either parsed two- four-digit year; month: either numeric month (single two-digit number) English abbreviated month name (e.g. Jan, Jun Dec) regardless case; month day: parsed two-digit numbers; hour minute: parsed single two-digit numbers; second: parsed single two-digit numbers optional fractional part.","code":"# Years: two-digit or four-digit numbers. years <- c(\"0\", \"1\", \"00\", \"01\", \"15\", \"30\", \"50\", \"68\", \"69\", \"80\", \"99\") create_iso8601(years, .format = \"y\") #> [1] NA NA \"2000\" \"2001\" \"2015\" \"2030\" \"2050\" \"2068\" \"1969\" \"1980\" #> [11] \"1999\" # Adjust the point where two-digits years are mapped to 2000's or 1900's. create_iso8601(years, .format = \"y\", .cutoff_2000 = 20L) #> [1] NA NA \"2000\" \"2001\" \"2015\" \"1930\" \"1950\" \"1968\" \"1969\" \"1980\" #> [11] \"1999\" # Both numeric months (two-digit only) and abbreviated months work out of the box months <- c(\"0\", \"00\", \"1\", \"01\", \"Jan\", \"jan\") create_iso8601(months, .format = \"m\") #> [1] NA \"--00\" NA \"--01\" \"--01\" \"--01\" # Month days: single or two-digit numbers, anything else results in NA. create_iso8601(c(\"1\", \"01\", \"001\", \"10\", \"20\", \"31\"), .format = \"d\") #> [1] \"----01\" \"----01\" NA \"----10\" \"----20\" \"----31\" # Hours create_iso8601(c(\"1\", \"01\", \"001\", \"10\", \"20\", \"31\"), .format = \"H\") #> [1] \"-----T01\" \"-----T01\" NA \"-----T10\" \"-----T20\" \"-----T31\" # Minutes create_iso8601(c(\"1\", \"01\", \"001\", \"10\", \"20\", \"60\"), .format = \"M\") #> [1] \"-----T-:01\" \"-----T-:01\" NA \"-----T-:10\" \"-----T-:20\" #> [6] \"-----T-:60\" # Seconds create_iso8601(c(\"1\", \"01\", \"23.04\", \"001\", \"10\", \"20\", \"60\"), .format = \"S\") #> [1] \"-----T-:-:01\" \"-----T-:-:01\" \"-----T-:-:23.04\" NA #> [5] \"-----T-:-:10\" \"-----T-:-:20\" \"-----T-:-:60\""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/iso_8601.html","id":"allowing-alternative-date-or-time-values","dir":"Articles","previous_headings":"","what":"Allowing alternative date or time values","title":"Converting dates, times or date-times to ISO 8601","text":"date time component values include special values, e.g. values encoding missing values, can indicate values possible alternatives parsing tolerate ; use .na argument: case achieve result using regexps:","code":"create_iso8601(\"U DEC 2019 14:00\", .format = \"d m y H:M\") #> [1] NA create_iso8601(\"U DEC 2019 14:00\", .format = \"d m y H:M\", .na = \"U\") #> [1] \"2019-12--T14:00\" create_iso8601(\"U UNK 2019 14:00\", .format = \"d m y H:M\") #> [1] NA create_iso8601(\"U UNK 2019 14:00\", .format = \"d m y H:M\", .na = c(\"U\", \"UNK\")) #> [1] \"2019----T14:00\" create_iso8601(\"U UNK 2019 14:00\", .format = \"(d|U) (m|UNK) y H:M\") #> [1] \"2019----T14:00\""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/iso_8601.html","id":"changing-reserved-format-characters","dir":"Articles","previous_headings":"","what":"Changing reserved format characters","title":"Converting dates, times or date-times to ISO 8601","text":"might cases reserved characters — \"y\", \"m\", \"d\", \"H\", \"M\", \"S\" — might get way specifying adequate format. example, might tempted use format \"HHMM\" try parse time \"14H00M\". assume first “H” codes parsing hour, second “H” literal “H” , actually, \"HH\" taken mean parsing hours, \"MM\" parse minutes. can use function fmt_cmp() specify alternative format regexps format, replacing default characters. next example, reassign new format strings hour minute components, thus freeing \"H\" \"M\" patterns interpreted hours minutes, taken literally: Note need make sure format component regexps mutually exclusive, .e. don’t overlapping matches; otherwise create_iso8601() fail error. next example months minutes represented \"m\" format resulting ambiguous format specification.","code":"create_iso8601(\"14H00M\", .format = \"HHMM\") #> [1] NA create_iso8601(\"14H00M\", .format = \"xHwM\", .fmt_c = fmt_cmp(hour = \"x\", min = \"w\")) #> [1] \"-----T14:00\" fmt_cmp(hour = \"h\", min = \"m\") #> $sec #> [1] \"S+\" #> #> $min #> [1] \"m\" #> #> $hour #> [1] \"h\" #> #> $mday #> [1] \"d+\" #> #> $mon #> [1] \"m+\" #> #> $year #> [1] \"y+\" #> #> attr(,\"class\") #> [1] \"fmt_c\" try(create_iso8601(\"14H00M\", .format = \"hHmM\", .fmt_c = fmt_cmp(hour = \"h\", min = \"m\"))) #> Error in purrr::map2(dots, .format, ~parse_dttm(dttm = .x, fmt = .y, na = .na, : #> ℹ In index: 1. #> Caused by error in `purrr::map()` at sdtm.oak/R/dtc_parse_dttm.R:78:3: #> ℹ In index: 1. #> Caused by error in `parse_dttm_fmt()` at sdtm.oak/R/parse_dttm_fmt.R:387:3: #> ! Patterns in `fmt_c` have overlapping matches."},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/study_sdtm_spec.html","id":"standards-metadata","dir":"Articles","previous_headings":"","what":"Standards Metadata","title":"All about Metadata","text":"standards metadata used {sdtm.oak} sourced CDISC Library sponsor MDR form documentation standards maintained. metadata provides information following: relationship Data Collection Standards (eCRF & eDT), SDTM mapping, Controlled Terminology Machine-readable standard SDTM mappings Algorithms associated metadata required SDTM automation standards study. upcoming releases {sdtm.oak}, effectively utilize standards metadata customize meet study requirements.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/study_sdtm_spec.html","id":"study-definition-metadata","dir":"Articles","previous_headings":"","what":"Study Definition Metadata","title":"All about Metadata","text":"Study Definition Metadata also referred Study Metadata. Study Definition Metadata provides information eCRF eDT data collected study. eCRF Metadata eCRF Design Metadata fetched EDC system. Metadata includes Forms Metadata: Identifier, eCRF label, Repeating format properties eCRF. Fields Metadata: Identifier, question label, datatype, properties data collection fields study. Data Dictionaries: Identifier controlled terms collected source. Visits: Name visits defined EDC. eDT Metadata eDT Metadata blueprint metadata describes data collected part external data transfer (clinical sites sponsor). includes Dataset name, label, repeating properties, etc. Variable name, datatype, label associated codelist, etc.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/articles/study_sdtm_spec.html","id":"study-sdtm-mappings-metadata-specifications","dir":"Articles","previous_headings":"","what":"Study SDTM Mappings Metadata (specifications)","title":"All about Metadata","text":"Study SDTM mappings metadata study SDTM specification. develop SDTM domains, {sdtm.oak} requires user prepare Study SDTM mappings metadata. Unlike conventional SDTM specification, includes one tab per domain defining target (SDTM domain, Variables) source (raw dataset, raw variables) SDTM mappings, SDTM spec {sdtm.oak} defines source--target relationship. source, SDTM mapping, algorithms, associated metadata defined. table presents columns SDTM mapping specification explanation.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/authors.html","id":null,"dir":"","previous_headings":"","what":"Authors","title":"Authors and Citation","text":"Rammprasad Ganapathy. Author, maintainer. Adam Forys. Author. Edgar Manukyan. Author. Rosemary Li. Author. Preetesh Parikh. Author. Lisa Houterloot. Author. Yogesh Gupta. Author. Omar Garcia. Author. Ramiro Magno. Author. Kamil Sijko. Author. Shiyu Chen. Author. Pattern Institute. Copyright holder, funder. F. Hoffmann-La Roche AG. Copyright holder, funder. Pfizer Inc. Copyright holder, funder. Transition Technologies Science. Copyright holder, funder.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/authors.html","id":"citation","dir":"","previous_headings":"","what":"Citation","title":"Authors and Citation","text":"Ganapathy R, Forys , Manukyan E, Li R, Parikh P, Houterloot L, Gupta Y, Garcia O, Magno R, Sijko K, Chen S (2024). sdtm.oak: SDTM Data Transformation Engine. R package version 0.0.0.9005, https://github.com/pharmaverse/sdtm.oak, https://pharmaverse.github.io/sdtm.oak/.","code":"@Manual{, title = {sdtm.oak: SDTM Data Transformation Engine}, author = {Rammprasad Ganapathy and Adam Forys and Edgar Manukyan and Rosemary Li and Preetesh Parikh and Lisa Houterloot and Yogesh Gupta and Omar Garcia and Ramiro Magno and Kamil Sijko and Shiyu Chen}, year = {2024}, note = {R package version 0.0.0.9005, https://github.com/pharmaverse/sdtm.oak}, url = {https://pharmaverse.github.io/sdtm.oak/}, }"},{"path":"https://pharmaverse.github.io/sdtm.oak/index.html","id":"sdtmoak-","dir":"","previous_headings":"","what":"SDTM Data Transformation Engine","title":"SDTM Data Transformation Engine","text":"EDC Data Standard agnostic solution enables pharmaceutical programming community develop SDTM datasets R. reusable algorithms concept sdtm.oak provides framework modular programming also can automate SDTM creation based standard SDTM spec.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/index.html","id":"installation","dir":"","previous_headings":"","what":"Installation","title":"SDTM Data Transformation Engine","text":"can install development version sdtm.oak GitHub :","code":"# install.packages(\"remotes\") remotes::install_github(\"pharmaverse/sdtm.oak\")"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/add_problems.html","id":null,"dir":"Reference","previous_headings":"","what":"Add ISO 8601 parsing problems — add_problems","title":"Add ISO 8601 parsing problems — add_problems","text":"add_problems() annotates returned value create_iso8601() possible parsing problems. annotation consists tibble problems, one row parsing failure (see Details section).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/add_problems.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add ISO 8601 parsing problems — add_problems","text":"","code":"add_problems(x, is_problem, dtc)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/add_problems.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add ISO 8601 parsing problems — add_problems","text":"x character vector date-times ISO 8601 format; typically, output format_iso8601(). is_problem logical indicating date/time inputs associated parsing failures. dtc list character vectors dates, times date-times' components. Typically, parameter takes value passed ... create_iso8601() call.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/add_problems.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add ISO 8601 parsing problems — add_problems","text":"Either x without modification, parsing problems exist, annotated x, meaning problems attribute holds parsing issues (see Details section).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/add_problems.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Add ISO 8601 parsing problems — add_problems","text":"function annotates input x, vector date-times ISO 8601 format, creating attribute named problems. attribute's value tibble parsing problems. problematic date/times indicated logical vector passed argument is_problem. attribute problems returned value contain first column named ..indicates date/time index problematic date/time x, many extra columns inputs (passed dtc). dtc named, names used name extra columns, otherwise get named sequentially like ..var1, ..var2, etc..","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/any_problems.html","id":null,"dir":"Reference","previous_headings":"","what":"Detect problems with the parsing of date/times — any_problems","title":"Detect problems with the parsing of date/times — any_problems","text":"any_problems() takes list capture matrices (see parse_dttm()) reports parsing problems means predicate values. FALSE value indicates parsing successful TRUE value parsing failure least one inputs create_iso8601(). Note internal function used context create_iso8601() source code hence capture matrix corresponds one input create_iso8601().","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/any_problems.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Detect problems with the parsing of date/times — any_problems","text":"","code":"any_problems(cap_matrices, .cutoff_2000 = 68L)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/any_problems.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Detect problems with the parsing of date/times — any_problems","text":"cap_matrices list capture matrices sense returned value parse_dttm(). .cutoff_2000 integer value. Two-digit years smaller equal .cutoff_2000 parsed though starting 20, otherwise parsed though starting 19.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/any_problems.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Detect problems with the parsing of date/times — any_problems","text":"logical whose length matches number underlying date/times passed inputs create_iso8601(), .e. whose length matches number rows capture matrices cap_matrices.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_capture_matrix.html","id":null,"dir":"Reference","previous_headings":"","what":"Assert capture matrix — assert_capture_matrix","title":"Assert capture matrix — assert_capture_matrix","text":"assert_capture_matrix() internal helper function aiding checking internal R object contains parsing results returned parse_dttm(): capture matrix. function checks capture matrix matrix contains six columns: year, mon, mday, hour, min sec.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_capture_matrix.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Assert capture matrix — assert_capture_matrix","text":"","code":"assert_capture_matrix(m)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_capture_matrix.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Assert capture matrix — assert_capture_matrix","text":"m character matrix.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_capture_matrix.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Assert capture matrix — assert_capture_matrix","text":"function throws error m either: character matrix; matrix whose columns (least): year, mon, mday, hour, min sec. Otherwise, returns m invisibly.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_clst.html","id":null,"dir":"Reference","previous_headings":"","what":"Assert a codelist code — assert_ct_clst","title":"Assert a codelist code — assert_ct_clst","text":"assert_ct_clst() asserts validity codelist code context controlled terminology specification.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_clst.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Assert a codelist code — assert_ct_clst","text":"","code":"assert_ct_clst(ct_spec, ct_clst, optional = FALSE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_clst.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Assert a codelist code — assert_ct_clst","text":"ct_spec Either data frame encoding controlled terminology data set, NULL. ct_clst string -asserted codelist code, NULL. optional scalar logical, indicating whether ct_clst can NULL .","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_clst.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Assert a codelist code — assert_ct_clst","text":"function throws error ct_clst valid codelist code given controlled terminology data set; otherwise, ct_clst returned invisibly.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_spec.html","id":null,"dir":"Reference","previous_headings":"","what":"Assert a controlled terminology specification — assert_ct_spec","title":"Assert a controlled terminology specification — assert_ct_spec","text":"assert_ct_spec() check whether ct_spec data frame contains variables: codelist_code, collected_value, term_synonyms, term_value. addition, also check data frame empty (rows), whether columns codelist_code term_value contain NA values.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_spec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Assert a controlled terminology specification — assert_ct_spec","text":"","code":"assert_ct_spec(ct_spec, optional = FALSE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_spec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Assert a controlled terminology specification — assert_ct_spec","text":"ct_spec data frame asserted valid controlled terminology data set.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_ct_spec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Assert a controlled terminology specification — assert_ct_spec","text":"function throws error ct_spec valid controlled terminology data set; otherwise, ct_spec returned invisibly.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_dtc_fmt.html","id":null,"dir":"Reference","previous_headings":"","what":"Assert date time character formats — assert_dtc_fmt","title":"Assert date time character formats — assert_dtc_fmt","text":"assert_dtc_fmt() takes character vector date/time formats checks formats supported, meaning checks one formats listed column fmt dtc_formats, failing error otherwise.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_dtc_fmt.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Assert date time character formats — assert_dtc_fmt","text":"","code":"assert_dtc_fmt(fmt)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_dtc_fmt.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Assert date time character formats — assert_dtc_fmt","text":"fmt character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_dtc_format.html","id":null,"dir":"Reference","previous_headings":"","what":"Assert dtc format — assert_dtc_format","title":"Assert dtc format — assert_dtc_format","text":"assert_dtc_format() internal helper function aiding checking .format parameter create_iso8601().","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_dtc_format.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Assert dtc format — assert_dtc_format","text":"","code":"assert_dtc_format(.format)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_dtc_format.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Assert dtc format — assert_dtc_format","text":".format argument create_iso8601()'s .format parameter.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assert_dtc_format.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Assert dtc format — assert_dtc_format","text":"function throws error .format either: character vector formats permitted assert_dtc_fmt(); list character vectors formats permitted assert_dtc_fmt(). Otherwise, returns .format invisibly.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive an SDTM variable — assign_no_ct","title":"Derive an SDTM variable — assign_no_ct","text":"assign_no_ct() maps variable raw dataset target SDTM variable terminology restrictions. assign_ct() maps variable raw dataset target SDTM variable following controlled terminology recoding.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive an SDTM variable — assign_no_ct","text":"","code":"assign_no_ct( tgt_dat = NULL, tgt_var, raw_dat, raw_var, id_vars = oak_id_vars() ) assign_ct( tgt_dat = NULL, tgt_var, raw_dat, raw_var, ct_spec, ct_clst, id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive an SDTM variable — assign_no_ct","text":"tgt_dat Target dataset: data frame merged raw_dat variables indicated id_vars. parameter optional, see section Value output changes depending argument value. tgt_var target SDTM variable: single string indicating name variable derived. raw_dat raw dataset (dataframe); must include variables passed id_vars raw_var. raw_var raw variable: single string indicating name raw variable raw_dat. id_vars Key variables used join raw dataset (raw_dat) target data set (raw_dat). ct_spec Study controlled terminology specification: dataframe minimal set columns, see ct_spec_vars() details. ct_clst codelist code indicating subset controlled terminology apply derivation.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive an SDTM variable — assign_no_ct","text":"returned data set depends value tgt_dat: target dataset supplied, meaning tgt_dat defaults NULL, returned data set raw_dat, selected variables indicated id_vars, new extra column: derived variable, indicated tgt_var. target dataset provided, merged raw data set raw_dat variables indicated id_vars, new column: derived variable, indicated tgt_var.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Derive an SDTM variable — assign_no_ct","text":"","code":"md1 <- tibble::tibble( oak_id = 1:14, raw_source = \"MD1\", patient_number = 101:114, MDIND = c( \"NAUSEA\", \"NAUSEA\", \"ANEMIA\", \"NAUSEA\", \"PYREXIA\", \"VOMITINGS\", \"DIARHHEA\", \"COLD\", \"FEVER\", \"LEG PAIN\", \"FEVER\", \"COLD\", \"COLD\", \"PAIN\" ) ) assign_no_ct( tgt_var = \"CMINDC\", raw_dat = md1, raw_var = \"MDIND\" ) #> # A tibble: 14 × 4 #> oak_id raw_source patient_number CMINDC #> #> 1 1 MD1 101 NAUSEA #> 2 2 MD1 102 NAUSEA #> 3 3 MD1 103 ANEMIA #> 4 4 MD1 104 NAUSEA #> 5 5 MD1 105 PYREXIA #> 6 6 MD1 106 VOMITINGS #> 7 7 MD1 107 DIARHHEA #> 8 8 MD1 108 COLD #> 9 9 MD1 109 FEVER #> 10 10 MD1 110 LEG PAIN #> 11 11 MD1 111 FEVER #> 12 12 MD1 112 COLD #> 13 13 MD1 113 COLD #> 14 14 MD1 114 PAIN cm_inter <- tibble::tibble( oak_id = 1:14, raw_source = \"MD1\", patient_number = 101:114, CMTRT = c( \"BABY ASPIRIN\", \"CORTISPORIN\", \"ASPIRIN\", \"DIPHENHYDRAMINE HCL\", \"PARCETEMOL\", \"VOMIKIND\", \"ZENFLOX OZ\", \"AMITRYPTYLINE\", \"BENADRYL\", \"DIPHENHYDRAMINE HYDROCHLORIDE\", \"TETRACYCLINE\", \"BENADRYL\", \"SOMINEX\", \"ZQUILL\" ), CMROUTE = c( \"ORAL\", \"ORAL\", NA, \"ORAL\", \"ORAL\", \"ORAL\", \"INTRAMUSCULAR\", \"INTRA-ARTERIAL\", NA, \"NON-STANDARD\", \"RANDOM_VALUE\", \"INTRA-ARTICULAR\", \"TRANSDERMAL\", \"OPHTHALMIC\" ) ) # Controlled terminology specification (ct_spec <- read_ct_spec_example(\"ct-01-cm\")) #> # A tibble: 33 × 8 #> codelist_code term_code CodedData term_value collected_value #> #> 1 C71113 C25473 QD QD QD (Every Day) #> 2 C71113 C64496 BID BID BID (Twice a Day) #> 3 C71113 C64499 PRN PRN PRN (As Needed) #> 4 C71113 C64516 Q2H Q2H Q2H (Every 2 Hours) #> 5 C71113 C64530 QID QID QID (4 Times a Day) #> 6 C66726 C25158 CAPSULE CAPSULE Capsule #> 7 C66726 C25394 PILL PILL Pill #> 8 C66726 C29167 LOTION LOTION Lotion #> 9 C66726 C42887 AEROSOL AEROSOL Aerosol #> 10 C66726 C42944 INHALANT INHALANT Inhalant #> # ℹ 23 more rows #> # ℹ 3 more variables: term_preferred_term , term_synonyms , #> # raw_codelist assign_ct( tgt_dat = cm_inter, tgt_var = \"CMINDC\", raw_dat = md1, raw_var = \"MDIND\", ct_spec = ct_spec, ct_clst = \"C66729\" ) #> # A tibble: 14 × 6 #> oak_id raw_source patient_number CMTRT CMROUTE CMINDC #> #> 1 1 MD1 101 BABY ASPIRIN ORAL NAUSEA #> 2 2 MD1 102 CORTISPORIN ORAL NAUSEA #> 3 3 MD1 103 ASPIRIN NA ANEMIA #> 4 4 MD1 104 DIPHENHYDRAMINE HCL ORAL NAUSEA #> 5 5 MD1 105 PARCETEMOL ORAL PYREX… #> 6 6 MD1 106 VOMIKIND ORAL VOMIT… #> 7 7 MD1 107 ZENFLOX OZ INTRAM… DIARH… #> 8 8 MD1 108 AMITRYPTYLINE INTRA-… COLD #> 9 9 MD1 109 BENADRYL NA FEVER #> 10 10 MD1 110 DIPHENHYDRAMINE HYDROCHLORIDE NON-ST… LEG P… #> 11 11 MD1 111 TETRACYCLINE RANDOM… FEVER #> 12 12 MD1 112 BENADRYL INTRA-… COLD #> 13 13 MD1 113 SOMINEX TRANSD… COLD #> 14 14 MD1 114 ZQUILL OPHTHA… PAIN"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign_datetime.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive an ISO8601 date-time variable — assign_datetime","title":"Derive an ISO8601 date-time variable — assign_datetime","text":"assign_datetime() maps one variables date/time components raw dataset target SDTM variable following ISO8601 format.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign_datetime.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive an ISO8601 date-time variable — assign_datetime","text":"","code":"assign_datetime( tgt_dat = NULL, tgt_var, raw_dat, raw_var, raw_fmt, raw_unk = c(\"UN\", \"UNK\"), id_vars = oak_id_vars(), .warn = TRUE )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign_datetime.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive an ISO8601 date-time variable — assign_datetime","text":"tgt_dat Target dataset: data frame merged raw_dat variables indicated id_vars. parameter optional, see section Value output changes depending argument value. tgt_var target SDTM variable: single string indicating name variable derived. raw_dat raw dataset (dataframe); must include variables passed id_vars raw_var. raw_var raw variable(s): character vector indicating name(s) raw variable(s) raw_dat date time components parsed ISO8601 format variable tgt_var. raw_fmt date/time parsing format. Either character vector list character vectors. character vector passed element taken parsing format variable indicated raw_var. list provided, element must character vector formats. first vector formats used parsing first variable raw_var, . raw_unk character vector string literals regarded missing values parsing. id_vars Key variables used join raw dataset (raw_dat) target data set (tgt_dat). .warn Whether warn parsing failures.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign_datetime.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive an ISO8601 date-time variable — assign_datetime","text":"returned data set depends value tgt_dat: target dataset supplied, meaning tgt_dat defaults NULL, returned data set raw_dat, selected variables indicated id_vars, new extra column: derived variable, indicated tgt_var. target dataset provided, merged raw data set raw_dat variables indicated id_vars, new column: derived variable, indicated tgt_var.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/assign_datetime.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Derive an ISO8601 date-time variable — assign_datetime","text":"","code":"# `md1`: an example raw data set. md1 <- tibble::tribble( ~oak_id, ~raw_source, ~patient_number, ~MDBDR, ~MDEDR, ~MDETM, 1L, \"MD1\", 375, NA, NA, NA, 2L, \"MD1\", 375, \"15-Sep-20\", NA, NA, 3L, \"MD1\", 376, \"17-Feb-21\", \"17-Feb-21\", NA, 4L, \"MD1\", 377, \"4-Oct-20\", NA, NA, 5L, \"MD1\", 377, \"20-Jan-20\", \"20-Jan-20\", \"10:00:00\", 6L, \"MD1\", 377, \"UN-UNK-2019\", \"UN-UNK-2019\", NA, 7L, \"MD1\", 377, \"20-UNK-2019\", \"20-UNK-2019\", NA, 8L, \"MD1\", 378, \"UN-UNK-2020\", \"UN-UNK-2020\", NA, 9L, \"MD1\", 378, \"26-Jan-20\", \"26-Jan-20\", \"07:00:00\", 10L, \"MD1\", 378, \"28-Jan-20\", \"1-Feb-20\", NA, 11L, \"MD1\", 378, \"12-Feb-20\", \"18-Feb-20\", NA, 12L, \"MD1\", 379, \"10-UNK-2020\", \"20-UNK-2020\", NA, 13L, \"MD1\", 379, NA, NA, NA, 14L, \"MD1\", 379, NA, \"17-Feb-20\", NA ) # Using the raw data set `md1`, derive the variable CMSTDTC from MDBDR using # the parsing format (`raw_fmt`) `\"d-m-y\"` (day-month-year), while allowing # for the presence of special date component values (e.g. `\"UN\"` or `\"UNK\"`), # indicating that these values are missing/unknown (unk). cm1 <- assign_datetime( tgt_var = \"CMSTDTC\", raw_dat = md1, raw_var = \"MDBDR\", raw_fmt = \"d-m-y\", raw_unk = c(\"UN\", \"UNK\") ) cm1 #> # A tibble: 14 × 4 #> oak_id raw_source patient_number CMSTDTC #> #> 1 1 MD1 375 NA #> 2 2 MD1 375 2020-09-15 #> 3 3 MD1 376 2021-02-17 #> 4 4 MD1 377 2020-10-04 #> 5 5 MD1 377 2020-01-20 #> 6 6 MD1 377 2019 #> 7 7 MD1 377 2019---20 #> 8 8 MD1 378 2020 #> 9 9 MD1 378 2020-01-26 #> 10 10 MD1 378 2020-01-28 #> 11 11 MD1 378 2020-02-12 #> 12 12 MD1 379 2020---10 #> 13 13 MD1 379 NA #> 14 14 MD1 379 NA # Inspect parsing failures associated with derivation of CMSTDTC. problems(cm1$CMSTDTC) #> # A tibble: 3 × 2 #> ..i MDBDR #> #> 1 1 NA #> 2 13 NA #> 3 14 NA # `cm_inter`: an example target data set. cm_inter <- tibble::tibble( oak_id = 1L:14L, raw_source = \"MD1\", patient_number = c( 375, 375, 376, 377, 377, 377, 377, 378, 378, 378, 378, 379, 379, 379 ), CMTRT = c( \"BABY ASPIRIN\", \"CORTISPORIN\", \"ASPIRIN\", \"DIPHENHYDRAMINE HCL\", \"PARCETEMOL\", \"VOMIKIND\", \"ZENFLOX OZ\", \"AMITRYPTYLINE\", \"BENADRYL\", \"DIPHENHYDRAMINE HYDROCHLORIDE\", \"TETRACYCLINE\", \"BENADRYL\", \"SOMINEX\", \"ZQUILL\" ), CMINDC = c( \"NA\", \"NAUSEA\", \"ANEMIA\", \"NAUSEA\", \"PYREXIA\", \"VOMITINGS\", \"DIARHHEA\", \"COLD\", \"FEVER\", \"LEG PAIN\", \"FEVER\", \"COLD\", \"COLD\", \"PAIN\" ) ) # Same derivation as above but now involving the merging with the target # data set `cm_inter`. cm2 <- assign_datetime( tgt_dat = cm_inter, tgt_var = \"CMSTDTC\", raw_dat = md1, raw_var = \"MDBDR\", raw_fmt = \"d-m-y\" ) cm2 #> # A tibble: 14 × 6 #> oak_id raw_source patient_number CMTRT CMINDC CMSTDTC #> #> 1 1 MD1 375 BABY ASPIRIN NA NA … #> 2 2 MD1 375 CORTISPORIN NAUSEA 2020-0… #> 3 3 MD1 376 ASPIRIN ANEMIA 2021-0… #> 4 4 MD1 377 DIPHENHYDRAMINE HCL NAUSEA 2020-1… #> 5 5 MD1 377 PARCETEMOL PYREX… 2020-0… #> 6 6 MD1 377 VOMIKIND VOMIT… 2019 … #> 7 7 MD1 377 ZENFLOX OZ DIARH… 2019--… #> 8 8 MD1 378 AMITRYPTYLINE COLD 2020 … #> 9 9 MD1 378 BENADRYL FEVER 2020-0… #> 10 10 MD1 378 DIPHENHYDRAMINE HYDROCHLORIDE LEG P… 2020-0… #> 11 11 MD1 378 TETRACYCLINE FEVER 2020-0… #> 12 12 MD1 379 BENADRYL COLD 2020--… #> 13 13 MD1 379 SOMINEX COLD NA … #> 14 14 MD1 379 ZQUILL PAIN NA … # Inspect parsing failures associated with derivation of CMSTDTC. problems(cm2$CMSTDTC) #> # A tibble: 3 × 2 #> ..i MDBDR #> #> 1 1 NA #> 2 13 NA #> 3 14 NA # Derive CMSTDTC using both MDEDR and MDETM variables. # Note that the format `\"d-m-y\"` is used for parsing MDEDR and `\"H:M:S\"` for # MDETM (correspondence is by positional matching). cm3 <- assign_datetime( tgt_var = \"CMSTDTC\", raw_dat = md1, raw_var = c(\"MDEDR\", \"MDETM\"), raw_fmt = c(\"d-m-y\", \"H:M:S\"), raw_unk = c(\"UN\", \"UNK\") ) cm3 #> # A tibble: 14 × 4 #> oak_id raw_source patient_number CMSTDTC #> #> 1 1 MD1 375 NA #> 2 2 MD1 375 NA #> 3 3 MD1 376 2021-02-17 #> 4 4 MD1 377 NA #> 5 5 MD1 377 2020-01-20T10:00:00 #> 6 6 MD1 377 2019 #> 7 7 MD1 377 2019---20 #> 8 8 MD1 378 2020 #> 9 9 MD1 378 2020-01-26T07:00:00 #> 10 10 MD1 378 2020-02-01 #> 11 11 MD1 378 2020-02-18 #> 12 12 MD1 379 2020---20 #> 13 13 MD1 379 NA #> 14 14 MD1 379 2020-02-17 # Inspect parsing failures associated with derivation of CMSTDTC. problems(cm3$CMSTDTC) #> # A tibble: 12 × 3 #> ..i MDEDR MDETM #> #> 1 1 NA NA #> 2 2 NA NA #> 3 3 17-Feb-21 NA #> 4 4 NA NA #> 5 6 UN-UNK-2019 NA #> 6 7 20-UNK-2019 NA #> 7 8 UN-UNK-2020 NA #> 8 10 1-Feb-20 NA #> 9 11 18-Feb-20 NA #> 10 12 20-UNK-2020 NA #> 11 13 NA NA #> 12 14 17-Feb-20 NA"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/clear_cache.html","id":null,"dir":"Reference","previous_headings":"","what":"Clear {sdtm.oak} cache of memoised functions — clear_cache","title":"Clear {sdtm.oak} cache of memoised functions — clear_cache","text":"{sdtm.oak} functions results cached runtime efficiency. Use function reset cache. Memoised functions: ct_mappings()","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/clear_cache.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Clear {sdtm.oak} cache of memoised functions — clear_cache","text":"","code":"clear_cache()"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/clear_cache.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Clear {sdtm.oak} cache of memoised functions — clear_cache","text":"Returns logical value, indicating whether resetting cache successful (TRUE) (FALSE).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/clear_cache.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Clear {sdtm.oak} cache of memoised functions — clear_cache","text":"","code":"clear_cache() #> [1] TRUE"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/coalesce_capture_matrices.html","id":null,"dir":"Reference","previous_headings":"","what":"Coalesce capture matrices — coalesce_capture_matrices","title":"Coalesce capture matrices — coalesce_capture_matrices","text":"coalesce_capture_matrices() combines several capture matrices one. argument ... capture matrix sense output complete_capture_matrix(), meaning character matrix six columns whose names : year, mon, mday, hour, min sec.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/coalesce_capture_matrices.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Coalesce capture matrices — coalesce_capture_matrices","text":"","code":"coalesce_capture_matrices(...)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/coalesce_capture_matrices.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Coalesce capture matrices — coalesce_capture_matrices","text":"... sequence capture matrices.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/coalesce_capture_matrices.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Coalesce capture matrices — coalesce_capture_matrices","text":"single capture matrix whose values coalesced sense coalesce().","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/complete_capture_matrix.html","id":null,"dir":"Reference","previous_headings":"","what":"Complete a capture matrix — complete_capture_matrix","title":"Complete a capture matrix — complete_capture_matrix","text":"complete_capture_matrix() completes missing, , columns capture matrix.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/complete_capture_matrix.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Complete a capture matrix — complete_capture_matrix","text":"","code":"complete_capture_matrix(m)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/complete_capture_matrix.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Complete a capture matrix — complete_capture_matrix","text":"m character matrix might missing one following columns: year, mon, mday, hour, min sec.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/complete_capture_matrix.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Complete a capture matrix — complete_capture_matrix","text":"character matrix contains columns year, mon, mday, hour, min sec. existing columns dropped.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/condition_add.html","id":null,"dir":"Reference","previous_headings":"","what":"Add filtering tags to a data set — condition_add","title":"Add filtering tags to a data set — condition_add","text":"condition_add() tags records data set, indicating rows match specified conditions, resulting conditioned data frame. Learn integrate conditioned data frames SDTM domain derivation vignette(\"cnd_df\").","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/condition_add.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Add filtering tags to a data set — condition_add","text":"","code":"condition_add(dat, ..., .na = NA, .dat2 = rlang::env())"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/condition_add.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Add filtering tags to a data set — condition_add","text":"dat data frame. ... Conditions filter data frame. .na Return value used conditions evaluate NA. .dat2 optional environment look variables involved logical expression passed .... data frame list can also passed coerced environment internally.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/condition_add.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Add filtering tags to a data set — condition_add","text":"conditioned data frame, meaning tibble additional class cnd_df logical vector attribute indicating matching rows.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/condition_add.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Add filtering tags to a data set — condition_add","text":"","code":"(df <- tibble::tibble(x = 1L:3L, y = letters[x])) #> # A tibble: 3 × 2 #> x y #> #> 1 1 a #> 2 2 b #> 3 3 c # Mark rows for which `x` greater than `1` (cnd_df <- condition_add(dat = df, x > 1L)) #> # A tibble: 3 × 2 #> # Cond. tbl: 2/1/0 #> x y #> #> 1 F 1 a #> 2 T 2 b #> 3 T 3 c"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/contains_oak_id_vars.html","id":null,"dir":"Reference","previous_headings":"","what":"Does a vector contain the raw dataset key variables? — contains_oak_id_vars","title":"Does a vector contain the raw dataset key variables? — contains_oak_id_vars","text":"contains_oak_id_vars() evaluates whether character vector x contains raw dataset key variable names, .e. called Oak identifier variables --- defined return value oak_id_vars().","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/contains_oak_id_vars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Does a vector contain the raw dataset key variables? — contains_oak_id_vars","text":"","code":"contains_oak_id_vars(x)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/contains_oak_id_vars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Does a vector contain the raw dataset key variables? — contains_oak_id_vars","text":"x character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/contains_oak_id_vars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Does a vector contain the raw dataset key variables? — contains_oak_id_vars","text":"logical scalar value.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/create_iso8601.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert date or time collected values to ISO 8601 — create_iso8601","title":"Convert date or time collected values to ISO 8601 — create_iso8601","text":"create_iso8601() converts vectors dates, times date-times ISO 8601 format. Learn vignette(\"iso_8601\").","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/create_iso8601.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert date or time collected values to ISO 8601 — create_iso8601","text":"","code":"create_iso8601( ..., .format, .fmt_c = fmt_cmp(), .na = NULL, .cutoff_2000 = 68L, .check_format = FALSE, .warn = TRUE )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/create_iso8601.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert date or time collected values to ISO 8601 — create_iso8601","text":"... Character vectors dates, times date-times' components. .format Parsing format(s). Either character vector list character vectors. character vector passed element taken parsing format vector passed .... list provided, element must character vector formats. first vector formats used parsing first vector passed ..., . .fmt_c list regexps use parsing .format. Use fmt_cmp() create object pass argument parameter. .na character vector string literals regarded missing values parsing. .cutoff_2000 integer value. Two-digit years smaller equal .cutoff_2000 parsed though starting 20, otherwise parsed though starting 19. .check_format Whether check formats passed .format, meaning check selection validated formats dtc_formats; permissible interpretation formats. .warn Whether warn parsing failures.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/create_iso8601.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Convert date or time collected values to ISO 8601 — create_iso8601","text":"","code":"# Converting dates create_iso8601(c(\"2020-01-01\", \"20200102\"), .format = \"y-m-d\") #> [1] \"2020-01-01\" NA create_iso8601(c(\"2020-01-01\", \"20200102\"), .format = \"ymd\") #> [1] NA \"2020-01-02\" create_iso8601(c(\"2020-01-01\", \"20200102\"), .format = list(c(\"y-m-d\", \"ymd\"))) #> [1] \"2020-01-01\" \"2020-01-02\" # Two-digit years are supported create_iso8601(c(\"20-01-01\", \"200101\"), .format = list(c(\"y-m-d\", \"ymd\"))) #> [1] \"2020-01-01\" \"2020-01-01\" # `.cutoff_2000` sets the cutoff for two-digit to four-digit year conversion # Default is at 68. create_iso8601(c(\"67-01-01\", \"68-01-01\", \"69-01-01\"), .format = \"y-m-d\") #> [1] \"2067-01-01\" \"2068-01-01\" \"1969-01-01\" # Change it to 80. create_iso8601(c(\"79-01-01\", \"80-01-01\", \"81-01-01\"), .format = \"y-m-d\", .cutoff_2000 = 80) #> [1] \"2079-01-01\" \"2080-01-01\" \"1981-01-01\" # Converting times create_iso8601(\"15:10\", .format = \"HH:MM\") #> [1] \"-----T15:10\" create_iso8601(\"2:10\", .format = \"HH:MM\") #> [1] \"-----T02:10\" create_iso8601(\"2:1\", .format = \"HH:MM\") #> [1] \"-----T02:01\" create_iso8601(\"02:01:56\", .format = \"HH:MM:SS\") #> [1] \"-----T02:01:56\" create_iso8601(\"020156.5\", .format = \"HHMMSS\") #> [1] \"-----T02:01:56.5\" # Converting date-times create_iso8601(\"12 NOV 202015:15\", .format = \"dd mmm yyyyHH:MM\") #> [1] \"2020-11-12T15:15\" # Indicate allowed missing values to make the parsing pass create_iso8601(\"U DEC 201914:00\", .format = \"dd mmm yyyyHH:MM\") #> [1] NA create_iso8601(\"U DEC 201914:00\", .format = \"dd mmm yyyyHH:MM\", .na = \"U\") #> [1] \"2019-12--T14:00\" create_iso8601(\"NOV 2020\", .format = \"m y\") #> [1] \"2020-11\" create_iso8601(c(\"MAR 2019\", \"MaR 2020\", \"mar 2021\"), .format = \"m y\") #> [1] \"2019-03\" \"2020-03\" \"2021-03\" create_iso8601(\"2019-04-041045-\", .format = \"yyyy-mm-ddHHMM-\") #> [1] \"2019-04-04T10:45\" create_iso8601(\"20200507null\", .format = \"ymd(HH:MM:SS)\") #> [1] NA create_iso8601(\"20200507null\", .format = \"ymd((HH:MM:SS)|null)\") #> [1] \"2020-05-07\" # Fractional seconds create_iso8601(\"2019-120602:20:13.1230001\", .format = \"y-mdH:M:S\") #> [1] \"2019-12-06T02:20:13.1230001\" # Use different reserved characters in the format specification # Here we change \"H\" to \"x\" and \"M\" to \"w\", for hour and minute, respectively. create_iso8601(\"14H00M\", .format = \"HHMM\") #> [1] NA create_iso8601(\"14H00M\", .format = \"xHwM\", .fmt_c = fmt_cmp(hour = \"x\", min = \"w\")) #> [1] \"-----T14:00\" # Alternative formats with unknown values datetimes <- c(\"UN UNK 201914:00\", \"UN JAN 2021\") format <- list(c(\"dd mmm yyyy\", \"dd mmm yyyyHH:MM\")) create_iso8601(datetimes, .format = format, .na = c(\"UN\", \"UNK\")) #> [1] \"2019----T14:00\" \"2021-01\" # Dates and times may come in many format variations fmt <- \"dd MMM yyyy HH nn ss\" fmt_cmp <- fmt_cmp(mon = \"MMM\", min = \"nn\", sec = \"ss\") create_iso8601(\"05 feb 1985 12 55 02\", .format = fmt, .fmt_c = fmt_cmp) #> [1] \"1985-02-05T12:55:02\""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_map.html","id":null,"dir":"Reference","previous_headings":"","what":"Recode according to controlled terminology — ct_map","title":"Recode according to controlled terminology — ct_map","text":"ct_map() recodes vector following controlled terminology.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_map.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Recode according to controlled terminology — ct_map","text":"","code":"ct_map( x, ct_spec = NULL, ct_clst = NULL, from = ct_spec_vars(\"from\"), to = ct_spec_vars(\"to\") )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_map.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Recode according to controlled terminology — ct_map","text":"x character vector terms recoded following controlled terminology. ct_spec tibble providing controlled terminology specification. ct_clst character vector indicating set possible controlled terminology codelists codes used recoding. default (NULL) codelists available ct_spec used. character vector column names indicating variables containing values matched terminology recoding. single string indicating column whose values recoded .","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_map.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Recode according to controlled terminology — ct_map","text":"character vector terminology recoded values x. match found controlled terminology spec provided ct_spec, x values returned uppercase. ct_spec provided x returned unchanged.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_map.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Recode according to controlled terminology — ct_map","text":"","code":"# A few example terms. terms <- c( \"/day\", \"Yes\", \"Unknown\", \"Prior\", \"Every 2 hours\", \"Percentage\", \"International Unit\" ) # Load a controlled terminology example (ct_spec <- read_ct_spec_example(\"ct-01-cm\")) #> # A tibble: 33 × 8 #> codelist_code term_code CodedData term_value collected_value #> #> 1 C71113 C25473 QD QD QD (Every Day) #> 2 C71113 C64496 BID BID BID (Twice a Day) #> 3 C71113 C64499 PRN PRN PRN (As Needed) #> 4 C71113 C64516 Q2H Q2H Q2H (Every 2 Hours) #> 5 C71113 C64530 QID QID QID (4 Times a Day) #> 6 C66726 C25158 CAPSULE CAPSULE Capsule #> 7 C66726 C25394 PILL PILL Pill #> 8 C66726 C29167 LOTION LOTION Lotion #> 9 C66726 C42887 AEROSOL AEROSOL Aerosol #> 10 C66726 C42944 INHALANT INHALANT Inhalant #> # ℹ 23 more rows #> # ℹ 3 more variables: term_preferred_term , term_synonyms , #> # raw_codelist # Use all possible matching terms in the controlled terminology. ct_map(x = terms, ct_spec = ct_spec) #> [1] \"QD\" \"Y\" \"UNKNOWN\" \"BEFORE\" \"Q2H\" \"%\" \"IU\" # Note that if the controlled terminology mapping is restricted to a codelist # code, e.g. C71113, then only `\"/day\"` and `\"Every 2 hours\"` get mapped to # `\"QD\"` and `\"Q2H\"`, respectively; remaining terms won't match given the # codelist code restriction, and will be mapped to an uppercase version of # the original terms. ct_map(x = terms, ct_spec = ct_spec, ct_clst = \"C71113\") #> [1] \"QD\" \"YES\" \"UNKNOWN\" #> [4] \"PRIOR\" \"Q2H\" \"PERCENTAGE\" #> [7] \"INTERNATIONAL UNIT\""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_mappings.html","id":null,"dir":"Reference","previous_headings":"","what":"Controlled terminology mappings — ct_mappings","title":"Controlled terminology mappings — ct_mappings","text":"ct_mappings() takes controlled terminology specification returns mappings form tibble long format, .e. recoding values column column values, one mapping per row. resulting mappings unique, .e. values duplicated two columns, first column indicated takes precedence, mapping retained controlled terminology map.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_mappings.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Controlled terminology mappings — ct_mappings","text":"","code":"ct_mappings(ct_spec, from = ct_spec_vars(\"from\"), to = ct_spec_vars(\"to\"))"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_mappings.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Controlled terminology mappings — ct_mappings","text":"ct_spec Controlled terminology specification tibble. row mapped controlled term. Controlled terms expected column indicated to_col. character vector column names indicating variables containing values recoded. single string indicating column whose values recoded .","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_mappings.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Controlled terminology mappings — ct_mappings","text":"tibble two columns, , indicating mapping values, one per row.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_example.html","id":null,"dir":"Reference","previous_headings":"","what":"Find the path to an example controlled terminology file — ct_spec_example","title":"Find the path to an example controlled terminology file — ct_spec_example","text":"ct_spec_example() resolves local path example controlled terminology file.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_example.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Find the path to an example controlled terminology file — ct_spec_example","text":"","code":"ct_spec_example(example)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_example.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Find the path to an example controlled terminology file — ct_spec_example","text":"example string either basename, file name, relative path controlled terminology file bundled {stdm.oak}, see examples.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_example.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Find the path to an example controlled terminology file — ct_spec_example","text":"local path example file example supplied, character vector example file names.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_example.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Find the path to an example controlled terminology file — ct_spec_example","text":"","code":"# Get the local path to controlled terminology example file 01 # Using the basename only: ct_spec_example(\"ct-01-cm\") #> [1] \"/renv/lib/R-4.3/x86_64-pc-linux-gnu/sdtm.oak/ct/ct-01-cm.csv\" # Using the file name: ct_spec_example(\"ct-01-cm.csv\") #> [1] \"/renv/lib/R-4.3/x86_64-pc-linux-gnu/sdtm.oak/ct/ct-01-cm.csv\" # Using the relative path: ct_spec_example(\"ct/ct-01-cm.csv\") #> [1] \"/renv/lib/R-4.3/x86_64-pc-linux-gnu/sdtm.oak/ct/ct-01-cm.csv\" # If no example is provided it returns a vector of possible choices. ct_spec_example() #> [1] \"ct-01-cm.csv\""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_vars.html","id":null,"dir":"Reference","previous_headings":"","what":"Controlled terminology variables — ct_spec_vars","title":"Controlled terminology variables — ct_spec_vars","text":"ct_spec_vars() returns mandatory variables present data set representing controlled terminology. default, returns required variables. subset variables used matching terms needed, request subset variables passing argument value \"\". mapping-variable requested, simply pass \"\". codelist code variable name needed pass \"ct_clst\".","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_vars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Controlled terminology variables — ct_spec_vars","text":"","code":"ct_spec_vars(set = c(\"all\", \"ct_clst\", \"from\", \"to\"))"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ct_spec_vars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Controlled terminology variables — ct_spec_vars","text":"set scalar character (string), one : \"\" (default), \"ct_clst\", \"\" \"\".","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ctl_new_rowid_pillar.cnd_df.html","id":null,"dir":"Reference","previous_headings":"","what":"Conditioned tibble pillar print method — ctl_new_rowid_pillar.cnd_df","title":"Conditioned tibble pillar print method — ctl_new_rowid_pillar.cnd_df","text":"Conditioned tibble pillar print method","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ctl_new_rowid_pillar.cnd_df.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Conditioned tibble pillar print method — ctl_new_rowid_pillar.cnd_df","text":"","code":"# S3 method for cnd_df ctl_new_rowid_pillar(controller, x, width, ...)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/ctl_new_rowid_pillar.cnd_df.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Conditioned tibble pillar print method — ctl_new_rowid_pillar.cnd_df","text":"controller object class \"tbl\" currently printed. x simple (one-dimensional) vector. width available width, can vector multiple tiers. ... dots future extensions must empty.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dataset_oak_vignette.html","id":null,"dir":"Reference","previous_headings":"","what":"Output a Dataset in a Vignette in the sdtm.oak Format — dataset_oak_vignette","title":"Output a Dataset in a Vignette in the sdtm.oak Format — dataset_oak_vignette","text":"Output dataset vignette pre-specified sdtm.oak format.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dataset_oak_vignette.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Output a Dataset in a Vignette in the sdtm.oak Format — dataset_oak_vignette","text":"","code":"dataset_oak_vignette(dataset, display_vars = NULL, filter = NULL)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dataset_oak_vignette.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Output a Dataset in a Vignette in the sdtm.oak Format — dataset_oak_vignette","text":"dataset Dataset output vignette display_vars Variables selected demonstrate outcome mapping Permitted Values: list variables Default NULL display_vars NULL, selected variables visible vignette variables hidden. can made visible clicking theChoose columns display button. filter Filter condition specified condition applied dataset displayed. Permitted Values: condition","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dataset_oak_vignette.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Output a Dataset in a Vignette in the sdtm.oak Format — dataset_oak_vignette","text":"HTML table","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_blfl.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive Baseline Flag or Last Observation Before Exposure Flag — derive_blfl","title":"Derive Baseline Flag or Last Observation Before Exposure Flag — derive_blfl","text":"Derive baseline flag variable (--BLFL) last observation exposure flag (--LOBXFL), observation date/time (--DTC), DM domain reference date/time.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_blfl.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive Baseline Flag or Last Observation Before Exposure Flag — derive_blfl","text":"","code":"derive_blfl( sdtm_in, dm_domain, tgt_var, ref_var, baseline_visits = character(), baseline_timepoints = character() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_blfl.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive Baseline Flag or Last Observation Before Exposure Flag — derive_blfl","text":"sdtm_in Input SDTM domain. dm_domain DM domain reference variable ref_var tgt_var Name variable derived (--BLFL --LOBXFL -- domain). ref_var vector date/time Demographics (DM) dataset, serves point comparison observations study. Common choices reference variable include \"RFSTDTC\" (date/time first study treatment) \"RFXSTDTC\" (date/time first exposure study drug). baseline_visits character vector specifying baseline visits within study. visits identified critical points data collection start study, intervention applied. allows function assign baseline flag --DTC matches reference date. baseline_timepoints character vector timepoints values --TPT specifies specific timepoints baseline visits key assessments measurements taken. allows function assign baseline flag --DTC matches reference date.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_blfl.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive Baseline Flag or Last Observation Before Exposure Flag — derive_blfl","text":"Modified input data frame baseline flag variable --BLFL last observation exposure flag --LOBXFL added.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_blfl.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Derive Baseline Flag or Last Observation Before Exposure Flag — derive_blfl","text":"derivation follows: Remove records result (--ORRES) missing. Also, exclude records results labeled \"ND\" (Data) \"DONE\" --ORRES column, indicate measurement observation completed. Remove records status (--STAT) indicates observation test performed, marked \"DONE\". Divide date time column (--DTC) reference date/time variable (ref_var) separate date time components. Ignore seconds recorded time component, focusing hours minutes calculations. Set partial missing dates NA. Set partial missing times NA. Filter rows domain reference dates equal NA. (Ref X) Filter X rows domain date (--DTC) prior (less ) reference date. (Ref ) Filter X rows domain date (--DTC) equal reference date domain reference times equal NA domain time prior (less ) reference time. (Ref B) Filter X rows domain date (--DTC) equal reference date domain /reference time equal NA : VISIT baseline visits list (exists) xxTPT baseline timepoints list (exists). (Ref C) Combine rows , B, C get data frame pre-reference date observations. Sort rows USUBJID, --STAT, --ORRES. Group USUBJID --TESTCD filter rows maximum value --DTC. Keep oak id variables --TESTCD (unique values). Remove duplicate rows. Assign baseline flag variable, --BLFL, last observation exposure flag (--LOBXFL) variable rows. Join baseline flag onto input dataset based oak id vars","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_blfl.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Derive Baseline Flag or Last Observation Before Exposure Flag — derive_blfl","text":"","code":"dm <- tibble::tribble( ~USUBJID, ~RFSTDTC, ~RFXSTDTC, \"test_study-375\", \"2020-09-28T10:10\", \"2020-09-28T10:10\", \"test_study-376\", \"2020-09-21T11:00\", \"2020-09-21T11:00\", \"test_study-377\", NA, NA, \"test_study-378\", \"2020-01-20T10:00\", \"2020-01-20T10:00\", \"test_study-379\", NA, NA, ) dm #> # A tibble: 5 × 3 #> USUBJID RFSTDTC RFXSTDTC #> #> 1 test_study-375 2020-09-28T10:10 2020-09-28T10:10 #> 2 test_study-376 2020-09-21T11:00 2020-09-21T11:00 #> 3 test_study-377 NA NA #> 4 test_study-378 2020-01-20T10:00 2020-01-20T10:00 #> 5 test_study-379 NA NA sdtm_in <- tibble::tribble( ~DOMAIN, ~oak_id, ~raw_source, ~patient_number, ~USUBJID, ~VSDTC, ~VSTESTCD, ~VSORRES, ~VSSTAT, ~VISIT, \"VS\", 1L, \"VTLS1\", 375L, \"test_study-375\", \"2020-09-01T13:31\", \"DIABP\", \"90\", NA, \"SCREENING\", \"VS\", 2L, \"VTLS1\", 375L, \"test_study-375\", \"2020-10-01T11:20\", \"DIABP\", \"90\", NA, \"SCREENING\", \"VS\", 1L, \"VTLS1\", 375L, \"test_study-375\", \"2020-09-28T10:10\", \"PULSE\", \"ND\", NA, \"SCREENING\", \"VS\", 2L, \"VTLS1\", 375L, \"test_study-375\", \"2020-10-01T13:31\", \"PULSE\", \"85\", NA, \"SCREENING\", \"VS\", 1L, \"VTLS2\", 375L, \"test_study-375\", \"2020-09-28T10:10\", \"SYSBP\", \"120\", NA, \"SCREENING\", \"VS\", 2L, \"VTLS2\", 375L, \"test_study-375\", \"2020-09-28T10:05\", \"SYSBP\", \"120\", NA, \"SCREENING\", \"VS\", 1L, \"VTLS1\", 376L, \"test_study-376\", \"2020-09-20\", \"DIABP\", \"75\", NA, \"SCREENING\", \"VS\", 1L, \"VTLS1\", 376L, \"test_study-376\", \"2020-09-20\", \"PULSE\", NA, \"NOT DONE\", \"SCREENING\", \"VS\", 2L, \"VTLS1\", 376L, \"test_study-376\", \"2020-09-20\", \"PULSE\", \"110\", NA, \"SCREENING\", \"VS\", 2L, \"VTLS1\", 378L, \"test_study-378\", \"2020-01-20T10:00\", \"PULSE\", \"110\", NA, \"SCREENING\", \"VS\", 3L, \"VTLS1\", 378L, \"test_study-378\", \"2020-01-21T11:00\", \"PULSE\", \"105\", NA, \"SCREENING\" ) sdtm_in #> # A tibble: 11 × 10 #> DOMAIN oak_id raw_source patient_number USUBJID VSDTC VSTESTCD VSORRES VSSTAT #> #> 1 VS 1 VTLS1 375 test_s… 2020… DIABP 90 NA #> 2 VS 2 VTLS1 375 test_s… 2020… DIABP 90 NA #> 3 VS 1 VTLS1 375 test_s… 2020… PULSE ND NA #> 4 VS 2 VTLS1 375 test_s… 2020… PULSE 85 NA #> 5 VS 1 VTLS2 375 test_s… 2020… SYSBP 120 NA #> 6 VS 2 VTLS2 375 test_s… 2020… SYSBP 120 NA #> 7 VS 1 VTLS1 376 test_s… 2020… DIABP 75 NA #> 8 VS 1 VTLS1 376 test_s… 2020… PULSE NA NOT D… #> 9 VS 2 VTLS1 376 test_s… 2020… PULSE 110 NA #> 10 VS 2 VTLS1 378 test_s… 2020… PULSE 110 NA #> 11 VS 3 VTLS1 378 test_s… 2020… PULSE 105 NA #> # ℹ 1 more variable: VISIT observed_output <- derive_blfl( sdtm_in = sdtm_in, dm_domain = dm, tgt_var = \"VSLOBXFL\", ref_var = \"RFXSTDTC\", baseline_visits = c(\"SCREENING\") ) observed_output #> # A tibble: 11 × 11 #> DOMAIN oak_id raw_source patient_number USUBJID VSDTC VSTESTCD VSORRES VSSTAT #> #> 1 VS 1 VTLS1 375 test_s… 2020… DIABP 90 NA #> 2 VS 2 VTLS1 375 test_s… 2020… DIABP 90 NA #> 3 VS 1 VTLS1 375 test_s… 2020… PULSE ND NA #> 4 VS 2 VTLS1 375 test_s… 2020… PULSE 85 NA #> 5 VS 1 VTLS2 375 test_s… 2020… SYSBP 120 NA #> 6 VS 2 VTLS2 375 test_s… 2020… SYSBP 120 NA #> 7 VS 1 VTLS1 376 test_s… 2020… DIABP 75 NA #> 8 VS 1 VTLS1 376 test_s… 2020… PULSE NA NOT D… #> 9 VS 2 VTLS1 376 test_s… 2020… PULSE 110 NA #> 10 VS 2 VTLS1 378 test_s… 2020… PULSE 110 NA #> 11 VS 3 VTLS1 378 test_s… 2020… PULSE 105 NA #> # ℹ 2 more variables: VISIT , VSLOBXFL "},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_seq.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive the sequence number (--SEQ) variable — derive_seq","title":"Derive the sequence number (--SEQ) variable — derive_seq","text":"derive_seq() creates new identifier variable: sequence number (--SEQ). function adds newly derived variable tgt_dat, namely sequence number (--SEQ) whose name one provided tgt_var. integer sequence generated uniquely identifies record within domain. Prior derivation tgt_var, data frame tgt_dat sorted according grouping variables indicated rec_vars.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_seq.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive the sequence number (--SEQ) variable — derive_seq","text":"","code":"derive_seq( tgt_dat, tgt_var, rec_vars, sbj_vars = sdtm.oak::sbj_vars(), start_at = 1L )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_seq.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive the sequence number (--SEQ) variable — derive_seq","text":"tgt_dat target dataset, data frame. tgt_var target SDTM variable: single string indicating name sequence number (--SEQ) variable, e.g. \"DSSEQ\". Note supplying name ending \"SEQ\" raise warning. rec_vars character vector record-level identifier variables. sbj_vars character vector subject-level identifier variables. start_at sequence numbering starts value (default 1).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_seq.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive the sequence number (--SEQ) variable — derive_seq","text":"Returns data frame supplied tgt_dat newly derived variable, .e. sequence number (--SEQ), whose name passed tgt_var. variable type integer.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_seq.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Derive the sequence number (--SEQ) variable — derive_seq","text":"","code":"# A VS raw data set example (vs <- read_domain_example(\"vs\")) #> # A tibble: 6 × 7 #> STUDYID DOMAIN USUBJID VSSPID VSTESTCD VSDTC VSTPTNUM #> #> 1 ABC123 VS ABC123-375 /F:VTLS1-D:9795532-R:2 DIABP 2020-09-01… NA #> 2 ABC123 VS ABC123-375 /F:VTLS1-D:9795532-R:2 TEMP 2020-09-01… NA #> 3 ABC123 VS ABC123-375 /F:VTLS2-D:9795533-R:2 DIABP 2020-09-28… 2 #> 4 ABC123 VS ABC123-375 /F:VTLS2-D:9795533-R:2 TEMP 2020-09-28… 2 #> 5 ABC123 VS ABC123-376 /F:VTLS1-D:9795591-R:1 DIABP 2020-09-20 NA #> 6 ABC123 VS ABC123-376 /F:VTLS1-D:9795591-R:1 TEMP 2020-09-20 NA # Derivation of VSSEQ rec_vars <- c(\"STUDYID\", \"USUBJID\", \"VSTESTCD\", \"VSDTC\", \"VSTPTNUM\") derive_seq(tgt_dat = vs, tgt_var = \"VSSEQ\", rec_vars = rec_vars) #> # A tibble: 6 × 8 #> STUDYID DOMAIN USUBJID VSSPID VSTESTCD VSDTC VSTPTNUM VSSEQ #> #> 1 ABC123 VS ABC123-375 /F:VTLS1-D:9795532-R:2 DIABP 2020… NA 1 #> 2 ABC123 VS ABC123-375 /F:VTLS2-D:9795533-R:2 DIABP 2020… 2 2 #> 3 ABC123 VS ABC123-375 /F:VTLS1-D:9795532-R:2 TEMP 2020… NA 3 #> 4 ABC123 VS ABC123-375 /F:VTLS2-D:9795533-R:2 TEMP 2020… 2 4 #> 5 ABC123 VS ABC123-376 /F:VTLS1-D:9795591-R:1 DIABP 2020… NA 1 #> 6 ABC123 VS ABC123-376 /F:VTLS1-D:9795591-R:1 TEMP 2020… NA 2 # An APSC raw data set example (apsc <- read_domain_example(\"apsc\")) #> # A tibble: 6 × 6 #> STUDYID RSUBJID SCTESTCD DOMAIN SREL SCCAT #> #> 1 ABC123 ABC123-210 LVSBJIND APSC FRIEND CAREGIVERSTUDY #> 2 ABC123 ABC123-210 EDULEVEL APSC FRIEND CAREGIVERSTUDY #> 3 ABC123 ABC123-210 TMSPPT APSC FRIEND CAREGIVERSTUDY #> 4 ABC123 ABC123-211 CAREDUR APSC SIBLING CAREGIVERSTUDY #> 5 ABC123 ABC123-211 LVSBJIND APSC SIBLING CAREGIVERSTUDY #> 6 ABC123 ABC123-212 JOBCLAS APSC SPOUSE CAREGIVERSTUDY # Derivation of APSEQ derive_seq( tgt_dat = apsc, tgt_var = \"APSEQ\", rec_vars = c(\"STUDYID\", \"RSUBJID\", \"SCTESTCD\"), sbj_vars = c(\"STUDYID\", \"RSUBJID\") ) #> # A tibble: 6 × 7 #> STUDYID RSUBJID SCTESTCD DOMAIN SREL SCCAT APSEQ #> #> 1 ABC123 ABC123-210 EDULEVEL APSC FRIEND CAREGIVERSTUDY 1 #> 2 ABC123 ABC123-210 LVSBJIND APSC FRIEND CAREGIVERSTUDY 2 #> 3 ABC123 ABC123-210 TMSPPT APSC FRIEND CAREGIVERSTUDY 3 #> 4 ABC123 ABC123-211 CAREDUR APSC SIBLING CAREGIVERSTUDY 1 #> 5 ABC123 ABC123-211 LVSBJIND APSC SIBLING CAREGIVERSTUDY 2 #> 6 ABC123 ABC123-212 JOBCLAS APSC SPOUSE CAREGIVERSTUDY 1"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_study_day.html","id":null,"dir":"Reference","previous_headings":"","what":"derive_study_day performs study day calculation — derive_study_day","title":"derive_study_day performs study day calculation — derive_study_day","text":"function takes input data frame reference data frame (DM domain cases), calculate study day reference date target date. case unexpected conditions like reference date unique patient, reference input dates actual dates, NA returned records.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_study_day.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"derive_study_day performs study day calculation — derive_study_day","text":"","code":"derive_study_day( sdtm_in, dm_domain, tgdt, refdt, study_day_var, merge_key = \"USUBJID\" )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_study_day.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"derive_study_day performs study day calculation — derive_study_day","text":"sdtm_in Input data frame contains target date. dm_domain Reference date frame contains reference date. tgdt Target date sdtm_in used calculate study day. refdt Reference date dm_domain used reference calculate study day. study_day_var New study day variable name output. example, AESTDY AE domain CMSTDY CM domain. merge_key Character represent merging key sdtm_in dm_domain.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_study_day.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"derive_study_day performs study day calculation — derive_study_day","text":"Data frame takes columns sdtm_in new variable represent calculated study day.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/derive_study_day.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"derive_study_day performs study day calculation — derive_study_day","text":"","code":"ae <- data.frame( USUBJID = c(\"study123-123\", \"study123-124\", \"study123-125\"), AESTDTC = c(\"2012-01-01\", \"2012-04-14\", \"2012-04-14\") ) dm <- data.frame( USUBJID = c(\"study123-123\", \"study123-124\", \"study123-125\"), RFSTDTC = c(\"2012-02-01\", \"2012-04-14\", NA) ) ae$AESTDTC <- as.Date(ae$AESTDTC) dm$RFSTDTC <- as.Date(dm$RFSTDTC) derive_study_day(ae, dm, \"AESTDTC\", \"RFSTDTC\", \"AESTDY\") #> USUBJID AESTDTC AESTDY #> 1 study123-123 2012-01-01 -31 #> 2 study123-124 2012-04-14 1 #> 3 study123-125 2012-04-14 NA"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":null,"dir":"Reference","previous_headings":"","what":"Find the path to an example SDTM domain file — domain_example","title":"Find the path to an example SDTM domain file — domain_example","text":"domain_example() resolves local path SDTM domain example file. domain examples files imported pharmaversesdtm. See Details section available datasets.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Find the path to an example SDTM domain file — domain_example","text":"","code":"domain_example(example)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":"source","dir":"Reference","previous_headings":"","what":"Source","title":"Find the path to an example SDTM domain file — domain_example","text":"See https://cran.r-project.org/package=pharmaversesdtm.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Find the path to an example SDTM domain file — domain_example","text":"example string either basename, file name, relative path SDTM domain example file bundled {stdm.oak}, e.g. \"cm\" (Concomitant Medication) \"ae\" (Adverse Events).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Find the path to an example SDTM domain file — domain_example","text":"local path example file example supplied, character vector example file names.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Find the path to an example SDTM domain file — domain_example","text":"Datasets obtained pharmaversesdtm originally sourced CDISC pilot project constructed ad-hoc admiral team. datasets bundled {sdtm.oak}, thus obviating dependence {pharmaversesdtm}.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":"example-sdtm-domains","dir":"Reference","previous_headings":"","what":"Example SDTM domains","title":"Find the path to an example SDTM domain file — domain_example","text":"\"ae\": Adverse Events (AE) data set. \"apsc\": Associated Persons Subject Characteristics (APSC) data set. \"cm\": Concomitant Medications (CM) data set. \"vs\": Vital Signs (VS) data set.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/domain_example.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Find the path to an example SDTM domain file — domain_example","text":"","code":"# If no example is provided it returns a vector of possible choices. domain_example() #> [1] \"ae\" \"apsc\" \"cm\" \"vs\" # Get the local path to the Concomitant Medication dataset file. domain_example(\"cm\") #> [1] \"/renv/lib/R-4.3/x86_64-pc-linux-gnu/sdtm.oak/domain/cm.rds\" # Local path to the Adverse Events dataset file. domain_example(\"ae\") #> [1] \"/renv/lib/R-4.3/x86_64-pc-linux-gnu/sdtm.oak/domain/ae.rds\""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dot_pipe.html","id":null,"dir":"Reference","previous_headings":"","what":"Explicit Dot Pipe — %.>%","title":"Explicit Dot Pipe — %.>%","text":"operator pipes object forward function call expression using explicit placement dot (.) placeholder. Unlike magrittr's %>% operator, %.>% automatically place left-hand side (lhs) first argument right-hand side (rhs) call. operator provides simpler alternative use braces magrittr, achieving similar behavior.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dot_pipe.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Explicit Dot Pipe — %.>%","text":"","code":"lhs %.>% rhs"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dot_pipe.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Explicit Dot Pipe — %.>%","text":"lhs value piped forward. rhs function call utilizes dot (.) placeholder specify lhs placed.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dot_pipe.html","id":"details","dir":"Reference","previous_headings":"","what":"Details","title":"Explicit Dot Pipe — %.>%","text":"%.>% operator used pipe lhs value rhs function call. Within rhs expression, placeholder . represents position lhs inserted. provides control lhs value appears rhs function call, compared magrittr pipe operator always places lhs first argument rhs. Unlike magrittr's pipe, may require use braces fully control placement lhs nested function calls, %.>% simplifies directly allowing multiple usages dot placeholder without requiring braces. example, following expression using magrittr's pipe braces: can written : without needing additional braces.","code":"library(magrittr) 1:10 %>% { c(min(.), max(.)) } 1:10 %.>% c(min(.), max(.))"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dot_pipe.html","id":"downside","dir":"Reference","previous_headings":"","what":"Downside","title":"Explicit Dot Pipe — %.>%","text":"disadvantage %.>% always need use dot placeholder, even piping first argument right-hand side (rhs).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dot_pipe.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Explicit Dot Pipe — %.>%","text":"","code":"# Equivalent to `subset(head(iris), 1:nrow(head(iris)) %% 2 == 0)` head(iris) %.>% subset(., 1:nrow(.) %% 2 == 0) #> Sepal.Length Sepal.Width Petal.Length Petal.Width Species #> 2 4.9 3.0 1.4 0.2 setosa #> 4 4.6 3.1 1.5 0.2 setosa #> 6 5.4 3.9 1.7 0.4 setosa # Equivalent to `c(min(1:10), max(1:10))` 1:10 %.>% c(min(.), max(.)) #> [1] 1 10"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_datepart.html","id":null,"dir":"Reference","previous_headings":"","what":"Extract date part from ISO8601 date/time variable — dtc_datepart","title":"Extract date part from ISO8601 date/time variable — dtc_datepart","text":"date part extracted ISO8601 date/time variable. default, partial missing dates set NA.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_datepart.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract date part from ISO8601 date/time variable — dtc_datepart","text":"","code":"dtc_datepart(dtc, partial_as_na = TRUE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_datepart.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract date part from ISO8601 date/time variable — dtc_datepart","text":"dtc Character vector containing ISO8601 date/times. partial_as_na Logical TRUE FALSE indicating whether partial dates set NA (default TRUE).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_datepart.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Extract date part from ISO8601 date/time variable — dtc_datepart","text":"Character vector containing ISO8601 dates.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_formats.html","id":null,"dir":"Reference","previous_headings":"","what":"Date/time collection formats — dtc_formats","title":"Date/time collection formats — dtc_formats","text":"Date/time collection formats","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_formats.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Date/time collection formats — dtc_formats","text":"","code":"dtc_formats"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_formats.html","id":"format","dir":"Reference","previous_headings":"","what":"Format","title":"Date/time collection formats — dtc_formats","text":"tibble 20 formats three variables: fmt Format string. type Whether date, time date-time. description Description date-time components parsed.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_formats.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Date/time collection formats — dtc_formats","text":"","code":"dtc_formats #> # A tibble: 20 × 3 #> fmt type description #> #> 1 ymd date Parses a date: year, month, and month day. #> 2 y m d date Parses a date: year, month, and month day. #> 3 y-m-d date Parses a date: year, month, and month day. #> 4 dmy date Parses a date: month day, month and year. #> 5 d m y date Parses a date: month day, month and year. #> 6 d-m-y date Parses a date: month day, month and year. #> 7 ym date Parses a date: year and month. #> 8 y m date Parses a date: year and month. #> 9 y-m date Parses a date: year and month. #> 10 my date Parses a date: month and year. #> 11 m y date Parses a date: month and year. #> 12 m-y date Parses a date: month and year. #> 13 HM time Parses a time: hour and minutes. #> 14 HMS time Parses a time: hour, minutes, and seconds. #> 15 H:M time Parses a time: hour and minutes. #> 16 H:M:S time Parses a time: hour, minutes and seconds. #> 17 ymdH:M:S datetime Parses a date-time: year, month, month day, hour, minut… #> 18 ymd H:M:S datetime Parses a date-time: year, month, month day, hour, minut… #> 19 y-m-d H:M:S datetime Parses a date-time: year, month, month day, hour, minut… #> 20 y m d H:M:S datetime Parses a date-time: year, month, month day, hour, minut…"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_timepart.html","id":null,"dir":"Reference","previous_headings":"","what":"Extract time part from ISO 8601 date/time variable — dtc_timepart","title":"Extract time part from ISO 8601 date/time variable — dtc_timepart","text":"time part extracted ISO 8601 date/time variable. default, partial missing times set NA, seconds ignored extracted.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_timepart.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Extract time part from ISO 8601 date/time variable — dtc_timepart","text":"","code":"dtc_timepart(dtc, partial_as_na = TRUE, ignore_seconds = TRUE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_timepart.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Extract time part from ISO 8601 date/time variable — dtc_timepart","text":"dtc Character vector containing ISO 8601 date/times. partial_as_na Logical TRUE FALSE indicating whether partial times set NA (default TRUE). ignore_seconds Logical TRUE FALSE indicating whether seconds ignored (default TRUE).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dtc_timepart.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Extract time part from ISO 8601 date/time variable — dtc_timepart","text":"Character vector containing ISO 8601 times.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dttm_fmt_to_regex.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert a parsed date/time format to regex — dttm_fmt_to_regex","title":"Convert a parsed date/time format to regex — dttm_fmt_to_regex","text":"dttm_fmt_to_regex() takes tibble parsed date/time format components (returned parse_dttm_fmt()), mapping date/time component formats regexps generates single regular expression groups matching date/time components.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dttm_fmt_to_regex.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert a parsed date/time format to regex — dttm_fmt_to_regex","text":"","code":"dttm_fmt_to_regex( fmt, fmt_regex = fmt_rg(), fmt_c = fmt_cmp(), anchored = TRUE )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dttm_fmt_to_regex.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert a parsed date/time format to regex — dttm_fmt_to_regex","text":"fmt format string (scalar) parsed patterns. fmt_regex named character vector regexps, one date/time component. anchored Whether final regex anchored, .e. bounded \"^\" \"$\" whole match.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/dttm_fmt_to_regex.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert a parsed date/time format to regex — dttm_fmt_to_regex","text":"string containing regular expression matching date/time components according format.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/eval_conditions.html","id":null,"dir":"Reference","previous_headings":"","what":"Evaluate conditions — eval_conditions","title":"Evaluate conditions — eval_conditions","text":"eval_conditions() evaluates set conditions context data frame optional environment. utility function provide easy way generate logical vector matching records set logical conditions involving variables data frame (dat) optionally supplementary environment (.env). set logical conditions provided expressions evaluated context dat .env. Variables looked dat, .env, calling function's environment, followed parent environments.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/eval_conditions.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Evaluate conditions — eval_conditions","text":"","code":"eval_conditions(dat, ..., .na = NA, .env = rlang::caller_env())"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/eval_conditions.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Evaluate conditions — eval_conditions","text":"dat data frame ... set logical conditions, e.g. y & z, x | z (x, y, z exist either columns dat environment .env). multiple expressions included, combined & operator. .na Return value used conditions evaluate NA. .env optional environment look variables involved logical expression passed .... data frame list can also passed coerced environment internally.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/eval_conditions.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Evaluate conditions — eval_conditions","text":"logical vector reflecting matching rows dat.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/find_int_gap.html","id":null,"dir":"Reference","previous_headings":"","what":"Find gap intervals in integer sequences — find_int_gap","title":"Find gap intervals in integer sequences — find_int_gap","text":"find_int_gap() determines start end positions gap intervals sequence integers. default, interval range look gaps defined minimum maximum values x; specify xmin xmax change range explicitly.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/find_int_gap.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Find gap intervals in integer sequences — find_int_gap","text":"","code":"find_int_gap(x, xmin = min(x), xmax = max(x))"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/find_int_gap.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Find gap intervals in integer sequences — find_int_gap","text":"x integer vector. xmin Left endpoint integer value. xmax Right endpoint integer value.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/find_int_gap.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Find gap intervals in integer sequences — find_int_gap","text":"tibble gap intervals two columns: start: left endpoint end: right endpoint gap intervals found empty tibble returned.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_cmp.html","id":null,"dir":"Reference","previous_headings":"","what":"Regexps for date/time format components — fmt_cmp","title":"Regexps for date/time format components — fmt_cmp","text":"fmt_cmp() creates character vector patterns match individual format date/time components.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_cmp.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Regexps for date/time format components — fmt_cmp","text":"","code":"fmt_cmp( sec = \"S+\", min = \"M+\", hour = \"H+\", mday = \"d+\", mon = \"m+\", year = \"y+\" )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_cmp.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Regexps for date/time format components — fmt_cmp","text":"sec string pattern matching second format component. min string pattern matching minute format component. hour string pattern matching hour format component. mday string pattern matching month day format component. mon string pattern matching month format component. year string pattern matching year format component.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_cmp.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Regexps for date/time format components — fmt_cmp","text":"named character vector date/time format patterns. vector six elements, one date/time component.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_cmp.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Regexps for date/time format components — fmt_cmp","text":"","code":"# Regexps to parse format components fmt_cmp() #> $sec #> [1] \"S+\" #> #> $min #> [1] \"M+\" #> #> $hour #> [1] \"H+\" #> #> $mday #> [1] \"d+\" #> #> $mon #> [1] \"m+\" #> #> $year #> [1] \"y+\" #> #> attr(,\"class\") #> [1] \"fmt_c\" fmt_cmp(year = \"yyyy\") #> $sec #> [1] \"S+\" #> #> $min #> [1] \"M+\" #> #> $hour #> [1] \"H+\" #> #> $mday #> [1] \"d+\" #> #> $mon #> [1] \"m+\" #> #> $year #> [1] \"yyyy\" #> #> attr(,\"class\") #> [1] \"fmt_c\""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_rg.html","id":null,"dir":"Reference","previous_headings":"","what":"Regexps for date/time components — fmt_rg","title":"Regexps for date/time components — fmt_rg","text":"fmt_rg() creates character vector named patterns match individual date/time components.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_rg.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Regexps for date/time components — fmt_rg","text":"","code":"fmt_rg( sec = \"(\\\\b\\\\d|\\\\d{2})(\\\\.\\\\d*)?\", min = \"(\\\\b\\\\d|\\\\d{2})\", hour = \"\\\\d?\\\\d\", mday = \"\\\\b\\\\d|\\\\d{2}\", mon = stringr::str_glue(\"\\\\d\\\\d|{months_abb_regex()}\"), year = \"(\\\\d{2})?\\\\d{2}\", na = NULL, sec_na = na, min_na = na, hour_na = na, mday_na = na, mon_na = na, year_na = na )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_rg.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Regexps for date/time components — fmt_rg","text":"sec Regexp second component. min Regexp minute component. hour Regexp hour component. mday Regexp month day component. mon Regexp month component. year Regexp year component. na Regexp alternatives, useful match special values coding missingness. sec_na na specifically second component. min_na na specifically minute component. hour_na na specifically hour component. mday_na na specifically month day component. mon_na na specifically month component. year_na na specifically year component.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/fmt_rg.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Regexps for date/time components — fmt_rg","text":"named character vector named patterns (regexps) matching date/time component.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/format_iso8601.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert date/time components into ISO8601 format — format_iso8601","title":"Convert date/time components into ISO8601 format — format_iso8601","text":"format_iso8601() takes character matrix date/time components converts component ISO8601 format. practice entails converting years four digit number, month, day, hours, minutes seconds two-digit numbers. available (NA) components converted \"-\".","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/format_iso8601.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert date/time components into ISO8601 format — format_iso8601","text":"","code":"format_iso8601(m, .cutoff_2000 = 68L)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/format_iso8601.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert date/time components into ISO8601 format — format_iso8601","text":"m character matrix date/time components. must six named columns: year, mon, mday, hour, min sec. .cutoff_2000 integer value. Two-digit years smaller equal .cutoff_2000 parsed though starting 20, otherwise parsed though starting 19.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/format_iso8601.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert date/time components into ISO8601 format — format_iso8601","text":"character vector date-times following ISO8601 format.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/generate_oak_id_vars.html","id":null,"dir":"Reference","previous_headings":"","what":"A function to generate oak_id_vars — generate_oak_id_vars","title":"A function to generate oak_id_vars — generate_oak_id_vars","text":"function generate oak_id_vars","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/generate_oak_id_vars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"A function to generate oak_id_vars — generate_oak_id_vars","text":"","code":"generate_oak_id_vars(raw_dat, pat_var, raw_src)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/generate_oak_id_vars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"A function to generate oak_id_vars — generate_oak_id_vars","text":"raw_dat raw dataset (dataframe) pat_var Variable holds patient number raw_src Name raw source","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/generate_oak_id_vars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"A function to generate oak_id_vars — generate_oak_id_vars","text":"dataframe","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/generate_oak_id_vars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"A function to generate oak_id_vars — generate_oak_id_vars","text":"","code":"raw_dataset <- tibble::tribble( ~patnum, ~MDRAW, 101L, \"BABY ASPIRIN\", 102L, \"CORTISPORIN\", 103L, NA_character_, 104L, \"DIPHENHYDRAMINE HCL\" ) # Generate oak_id_vars generate_oak_id_vars( raw_dat = raw_dataset, pat_var = \"patnum\", raw_src = \"Concomitant Medication\" ) #> # A tibble: 4 × 5 #> oak_id raw_source patient_number patnum MDRAW #> #> 1 1 Concomitant Medication 101 101 BABY ASPIRIN #> 2 2 Concomitant Medication 102 102 CORTISPORIN #> 3 3 Concomitant Medication 103 103 NA #> 4 4 Concomitant Medication 104 104 DIPHENHYDRAMINE HCL"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd.html","id":null,"dir":"Reference","previous_headings":"","what":"Get the conditioning vector from a conditioned data frame — get_cnd_df_cnd","title":"Get the conditioning vector from a conditioned data frame — get_cnd_df_cnd","text":"get_cnd_df_cnd() extracts conditioning vector conditioned data frame, .e. object class cnd_df.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get the conditioning vector from a conditioned data frame — get_cnd_df_cnd","text":"","code":"get_cnd_df_cnd(dat)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get the conditioning vector from a conditioned data frame — get_cnd_df_cnd","text":"dat conditioned data frame (cnd_df).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get the conditioning vector from a conditioned data frame — get_cnd_df_cnd","text":"conditioning vector (cnd) dat conditioned data frame (cnd_df), otherwise NULL, NULL dat conditioned data frame (cnd_df).","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd_sum.html","id":null,"dir":"Reference","previous_headings":"","what":"Get the summary of the conditioning vector from a conditioned data frame — get_cnd_df_cnd_sum","title":"Get the summary of the conditioning vector from a conditioned data frame — get_cnd_df_cnd_sum","text":"get_cnd_df_cnd_sum() extracts tally conditioning vector conditioned data frame.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd_sum.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Get the summary of the conditioning vector from a conditioned data frame — get_cnd_df_cnd_sum","text":"","code":"get_cnd_df_cnd_sum(dat)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd_sum.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Get the summary of the conditioning vector from a conditioned data frame — get_cnd_df_cnd_sum","text":"dat conditioned data frame (cnd_df).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/get_cnd_df_cnd_sum.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Get the summary of the conditioning vector from a conditioned data frame — get_cnd_df_cnd_sum","text":"vector three elements providing sum TRUE, FALSE, NA values conditioning vector (cnd), NULL dat conditioned data frame (cnd_df).","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/harcode.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive an SDTM variable with a hardcoded value — harcode","title":"Derive an SDTM variable with a hardcoded value — harcode","text":"hardcode_no_ct() maps hardcoded value target SDTM variable terminology restrictions. hardcode_ct() maps hardcoded value target SDTM variable controlled terminology recoding.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/harcode.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive an SDTM variable with a hardcoded value — harcode","text":"","code":"hardcode_no_ct( tgt_dat = NULL, tgt_val, raw_dat, raw_var, tgt_var, id_vars = oak_id_vars() ) hardcode_ct( tgt_dat = NULL, tgt_val, raw_dat, raw_var, tgt_var, ct_spec, ct_clst, id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/harcode.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive an SDTM variable with a hardcoded value — harcode","text":"tgt_dat Target dataset: data frame merged raw_dat variables indicated id_vars. parameter optional, see section Value output changes depending argument value. tgt_val target SDTM value hardcoded variable indicated tgt_var. raw_dat raw dataset (dataframe); must include variables passed id_vars raw_var. raw_var raw variable: single string indicating name raw variable raw_dat. tgt_var target SDTM variable: single string indicating name variable derived. id_vars Key variables used join raw dataset (raw_dat) target data set (raw_dat). ct_spec Study controlled terminology specification: dataframe minimal set columns, see ct_spec_vars() details. parameter optional, left NULL controlled terminology recoding applied. ct_clst codelist code indicating subset controlled terminology apply derivation. parameter optional, left NULL, possible recodings ct_spec attempted.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/harcode.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive an SDTM variable with a hardcoded value — harcode","text":"returned data set depends value tgt_dat: target dataset supplied, meaning tgt_dat defaults NULL, returned data set raw_dat, selected variables indicated id_vars, new extra column: derived variable, indicated tgt_var. target dataset provided, merged raw data set raw_dat variables indicated id_vars, new column: derived variable, indicated tgt_var.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/harcode.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Derive an SDTM variable with a hardcoded value — harcode","text":"","code":"md1 <- tibble::tribble( ~oak_id, ~raw_source, ~patient_number, ~MDRAW, 1L, \"MD1\", 101L, \"BABY ASPIRIN\", 2L, \"MD1\", 102L, \"CORTISPORIN\", 3L, \"MD1\", 103L, NA_character_, 4L, \"MD1\", 104L, \"DIPHENHYDRAMINE HCL\" ) # Derive a new variable `CMCAT` by overwriting `MDRAW` with the # hardcoded value \"GENERAL CONCOMITANT MEDICATIONS\". hardcode_no_ct( tgt_val = \"GENERAL CONCOMITANT MEDICATIONS\", raw_dat = md1, raw_var = \"MDRAW\", tgt_var = \"CMCAT\" ) #> # A tibble: 4 × 4 #> oak_id raw_source patient_number CMCAT #> #> 1 1 MD1 101 GENERAL CONCOMITANT MEDICATIONS #> 2 2 MD1 102 GENERAL CONCOMITANT MEDICATIONS #> 3 3 MD1 103 NA #> 4 4 MD1 104 GENERAL CONCOMITANT MEDICATIONS cm_inter <- tibble::tribble( ~oak_id, ~raw_source, ~patient_number, ~CMTRT, ~CMINDC, 1L, \"MD1\", 101L, \"BABY ASPIRIN\", NA, 2L, \"MD1\", 102L, \"CORTISPORIN\", \"NAUSEA\", 3L, \"MD1\", 103L, \"ASPIRIN\", \"ANEMIA\", 4L, \"MD1\", 104L, \"DIPHENHYDRAMINE HCL\", \"NAUSEA\", 5L, \"MD1\", 105L, \"PARACETAMOL\", \"PYREXIA\" ) # Derive a new variable `CMCAT` by overwriting `MDRAW` with the # hardcoded value \"GENERAL CONCOMITANT MEDICATIONS\" with a prior join to # `target_dataset`. hardcode_no_ct( tgt_dat = cm_inter, tgt_val = \"GENERAL CONCOMITANT MEDICATIONS\", raw_dat = md1, raw_var = \"MDRAW\", tgt_var = \"CMCAT\" ) #> # A tibble: 5 × 6 #> oak_id raw_source patient_number CMTRT CMINDC CMCAT #> #> 1 1 MD1 101 BABY ASPIRIN NA GENERAL CONCOMIT… #> 2 2 MD1 102 CORTISPORIN NAUSEA GENERAL CONCOMIT… #> 3 3 MD1 103 ASPIRIN ANEMIA NA #> 4 4 MD1 104 DIPHENHYDRAMINE HCL NAUSEA GENERAL CONCOMIT… #> 5 5 MD1 105 PARACETAMOL PYREXIA NA # Controlled terminology specification (ct_spec <- read_ct_spec_example(\"ct-01-cm\")) #> # A tibble: 33 × 8 #> codelist_code term_code CodedData term_value collected_value #> #> 1 C71113 C25473 QD QD QD (Every Day) #> 2 C71113 C64496 BID BID BID (Twice a Day) #> 3 C71113 C64499 PRN PRN PRN (As Needed) #> 4 C71113 C64516 Q2H Q2H Q2H (Every 2 Hours) #> 5 C71113 C64530 QID QID QID (4 Times a Day) #> 6 C66726 C25158 CAPSULE CAPSULE Capsule #> 7 C66726 C25394 PILL PILL Pill #> 8 C66726 C29167 LOTION LOTION Lotion #> 9 C66726 C42887 AEROSOL AEROSOL Aerosol #> 10 C66726 C42944 INHALANT INHALANT Inhalant #> # ℹ 23 more rows #> # ℹ 3 more variables: term_preferred_term , term_synonyms , #> # raw_codelist # Hardcoding of `CMCAT` with the value `\"GENERAL CONCOMITANT MEDICATIONS\"` # involving terminology recoding. `NA` values in `MDRAW` are preserved in # `CMCAT`. hardcode_ct( tgt_dat = cm_inter, tgt_var = \"CMCAT\", raw_dat = md1, raw_var = \"MDRAW\", tgt_val = \"GENERAL CONCOMITANT MEDICATIONS\", ct_spec = ct_spec, ct_clst = \"C66729\" ) #> # A tibble: 5 × 6 #> oak_id raw_source patient_number CMTRT CMINDC CMCAT #> #> 1 1 MD1 101 BABY ASPIRIN NA GENERAL CONCOMIT… #> 2 2 MD1 102 CORTISPORIN NAUSEA GENERAL CONCOMIT… #> 3 3 MD1 103 ASPIRIN ANEMIA NA #> 4 4 MD1 104 DIPHENHYDRAMINE HCL NAUSEA GENERAL CONCOMIT… #> 5 5 MD1 105 PARACETAMOL PYREXIA NA"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/index_for_recode.html","id":null,"dir":"Reference","previous_headings":"","what":"Determine Indices for Recoding — index_for_recode","title":"Determine Indices for Recoding — index_for_recode","text":"index_for_recode() identifies positions elements x match values specified vector. function primarily used facilitate recoding values pinpointing elements x correspond values thus need replaced updated.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/index_for_recode.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Determine Indices for Recoding — index_for_recode","text":"","code":"index_for_recode(x, from)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/index_for_recode.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Determine Indices for Recoding — index_for_recode","text":"x vector values search matches. vector values match elements x.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/index_for_recode.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Determine Indices for Recoding — index_for_recode","text":"integer vector length x, containing indices matched values vector. element x match value , corresponding position output NA. index information critical subsequent recoding operations.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_cnd_df.html","id":null,"dir":"Reference","previous_headings":"","what":"Check if a data frame is a conditioned data frame — is_cnd_df","title":"Check if a data frame is a conditioned data frame — is_cnd_df","text":"is_cnd_df() checks whether data frame conditioned data frame, .e. class cnd_df.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_cnd_df.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Check if a data frame is a conditioned data frame — is_cnd_df","text":"","code":"is_cnd_df(dat)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_cnd_df.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Check if a data frame is a conditioned data frame — is_cnd_df","text":"dat data frame.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_cnd_df.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Check if a data frame is a conditioned data frame — is_cnd_df","text":"TRUE dat conditioned data frame (class cnd_df), otherwise FALSE.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_seq_name.html","id":null,"dir":"Reference","previous_headings":"","what":"Is it a --SEQ variable name — is_seq_name","title":"Is it a --SEQ variable name — is_seq_name","text":"is_seq_name() returns variable names end \"SEQ\".","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_seq_name.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Is it a --SEQ variable name — is_seq_name","text":"","code":"is_seq_name(x)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_seq_name.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Is it a --SEQ variable name — is_seq_name","text":"x character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/is_seq_name.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Is it a --SEQ variable name — is_seq_name","text":"logical vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_mon.html","id":null,"dir":"Reference","previous_headings":"","what":"Format as a ISO8601 month — iso8601_mon","title":"Format as a ISO8601 month — iso8601_mon","text":"iso8601_mon() converts character vector whose values represent numeric abbreviated month names zero-padded numeric months.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_mon.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Format as a ISO8601 month — iso8601_mon","text":"","code":"iso8601_mon(x)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_mon.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Format as a ISO8601 month — iso8601_mon","text":"x character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_mon.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Format as a ISO8601 month — iso8601_mon","text":"character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_na.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert NA to ","title":"Convert NA to ","text":"iso8601_na() takes character vector converts NA values \"-\".","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_na.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert NA to ","text":"","code":"iso8601_na(x)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_na.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert NA to ","text":"x character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_na.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert NA to ","text":"character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_sec.html","id":null,"dir":"Reference","previous_headings":"","what":"Format as ISO8601 seconds — iso8601_sec","title":"Format as ISO8601 seconds — iso8601_sec","text":"iso8601_sec() converts character vector whose values represent seconds.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_sec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Format as ISO8601 seconds — iso8601_sec","text":"","code":"iso8601_sec(x)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_sec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Format as ISO8601 seconds — iso8601_sec","text":"x character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_sec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Format as ISO8601 seconds — iso8601_sec","text":"character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_truncate.html","id":null,"dir":"Reference","previous_headings":"","what":"Truncate a partial ISO8601 date-time — iso8601_truncate","title":"Truncate a partial ISO8601 date-time — iso8601_truncate","text":"iso8601_truncate() converts character vector ISO8601 dates, times date-times might partial truncates format removing missing components.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_truncate.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Truncate a partial ISO8601 date-time — iso8601_truncate","text":"","code":"iso8601_truncate(x, empty_as_na = TRUE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_truncate.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Truncate a partial ISO8601 date-time — iso8601_truncate","text":"x character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_truncate.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Truncate a partial ISO8601 date-time — iso8601_truncate","text":"character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_two_digits.html","id":null,"dir":"Reference","previous_headings":"","what":"Format as a ISO8601 two-digit number — iso8601_two_digits","title":"Format as a ISO8601 two-digit number — iso8601_two_digits","text":"iso8601_two_digits() converts single digit two digit number two digit, 0-padded, number. Failing parse input two digit number results NA.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_two_digits.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Format as a ISO8601 two-digit number — iso8601_two_digits","text":"","code":"iso8601_two_digits(x)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_two_digits.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Format as a ISO8601 two-digit number — iso8601_two_digits","text":"x character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_two_digits.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Format as a ISO8601 two-digit number — iso8601_two_digits","text":"character vector size x.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_year.html","id":null,"dir":"Reference","previous_headings":"","what":"Format as a ISO8601 four-digit year — iso8601_year","title":"Format as a ISO8601 four-digit year — iso8601_year","text":"iso8601_year() converts character vector whose values represent years four-digit years.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_year.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Format as a ISO8601 four-digit year — iso8601_year","text":"","code":"iso8601_year(x, cutoff_2000 = 68L)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_year.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Format as a ISO8601 four-digit year — iso8601_year","text":"x character vector. cutoff_2000 non-negative integer value. Two-digit years smaller equal cutoff_2000 parsed though starting 20, otherwise parsed though starting 19.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/iso8601_year.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Format as a ISO8601 four-digit year — iso8601_year","text":"character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/months_abb_regex.html","id":null,"dir":"Reference","previous_headings":"","what":"Regex for months' abbreviations — months_abb_regex","title":"Regex for months' abbreviations — months_abb_regex","text":"months_abb_regex() generates regex matches month abbreviations. finer control, case can specified parameter case.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/months_abb_regex.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Regex for months' abbreviations — months_abb_regex","text":"","code":"months_abb_regex(x = month.abb, case = c(\"any\", \"upper\", \"lower\", \"title\"))"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/months_abb_regex.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Regex for months' abbreviations — months_abb_regex","text":"x character vector three-letter month abbreviations. Default month.abb. case string scalar: \"\", month abbreviations matched case; \"upper\", match uppercase abbreviations; \"lower\", match lowercase; , \"title\" match title case.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/months_abb_regex.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Regex for months' abbreviations — months_abb_regex","text":"regex string.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/mutate.cnd_df.html","id":null,"dir":"Reference","previous_headings":"","what":"Mutate method for conditioned data frames — mutate.cnd_df","title":"Mutate method for conditioned data frames — mutate.cnd_df","text":"mutate.cnd_df() S3 method dispatched mutate generic conditioned data frames. function implements conditional mutate changing rows condition stored conditioned data frame TRUE.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/mutate.cnd_df.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Mutate method for conditioned data frames — mutate.cnd_df","text":"","code":"# S3 method for cnd_df mutate( .data, ..., .by = NULL, .keep = c(\"all\", \"used\", \"unused\", \"none\"), .before = NULL, .after = NULL )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/mutate.cnd_df.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Mutate method for conditioned data frames — mutate.cnd_df","text":".data conditioned data frame. ... Name-value pairs. name gives name column output. value can : vector length 1, recycled correct length. vector length current group (whole data frame ungrouped). NULL, remove column. data frame tibble, create multiple columns output. .used .data conditioned data frame. .keep Control columns .data retained output. Grouping columns columns created ... always kept. \"\" retains columns .data. default. \"used\" retains columns used ... create new columns. useful checking work, displays inputs outputs side--side. \"unused\" retains columns used ... create new columns. useful generate new columns, longer need columns used generate . \"none\" retain extra columns .data. grouping variables columns created ... kept. .used, use .instead. .Control new columns appear, .e. columns.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/new_cnd_df.html","id":null,"dir":"Reference","previous_headings":"","what":"Create a data frame with filtering tags — new_cnd_df","title":"Create a data frame with filtering tags — new_cnd_df","text":"new_cnd_df() creates conditioned data frame, classed cnd_df, meaning function extends data frame passed argument storing logical vector cnd (attribute) marks rows posterior conditional transformation methods support conditioned data frames.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/new_cnd_df.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Create a data frame with filtering tags — new_cnd_df","text":"","code":"new_cnd_df(dat, cnd, .warn = TRUE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/new_cnd_df.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Create a data frame with filtering tags — new_cnd_df","text":"dat data frame. cnd logical vector. Length must match number rows dat. .warn Whether warn creating new conditioned data frame case dat already one.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/new_cnd_df.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Create a data frame with filtering tags — new_cnd_df","text":"data frame dat additional class \"cnd_df\" following attributes: cnd: logical vector passed argument cnd: TRUE values mark rows dat used transformations; rows marked FALSE transformed; NA mark rows whose transformations applied resulting NA. cnd_sum: integer vector three elements providing sum TRUE, FALSE NA values cnd, respectively.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/oak_id_vars.html","id":null,"dir":"Reference","previous_headings":"","what":"Raw dataset keys — oak_id_vars","title":"Raw dataset keys — oak_id_vars","text":"oak_id_vars() helper function providing variable (column) names regarded keys tibbles representing raw datasets. default, set names oak_id, raw_source, patient_number. Extra variable names may indicated passed extra_vars appended default names.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/oak_id_vars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Raw dataset keys — oak_id_vars","text":"","code":"oak_id_vars(extra_vars = NULL)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/oak_id_vars.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Raw dataset keys — oak_id_vars","text":"extra_vars character vector extra column names appended default names: oak_id, raw_source, patient_number.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/oak_id_vars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Raw dataset keys — oak_id_vars","text":"character vector column names regarded keys raw datasets.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm.html","id":null,"dir":"Reference","previous_headings":"","what":"Parse a date, time, or date-time — parse_dttm_","title":"Parse a date, time, or date-time — parse_dttm_","text":"parse_dttm() extracts date time components. parse_dttm() wraps around parse_dttm_(), vectorized fmt.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parse a date, time, or date-time — parse_dttm_","text":"","code":"parse_dttm_( dttm, fmt, fmt_c = fmt_cmp(), na = NULL, sec_na = na, min_na = na, hour_na = na, mday_na = na, mon_na = na, year_na = na ) parse_dttm( dttm, fmt, fmt_c = fmt_cmp(), na = NULL, sec_na = na, min_na = na, hour_na = na, mday_na = na, mon_na = na, year_na = na )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Parse a date, time, or date-time — parse_dttm_","text":"dttm character vector dates, times date-times. fmt case parse_dttm(), character vector parsing formats, single string format case parse_dttm_(). character vector formats passed, format attempted turn first parsing result successful taking precedence final result. formats fmt can strings, however following characters (successive repetitions thereof) reserved sense treated special way: \"y\": parsed year; \"m\": parsed month; \"d\": parsed day; \"H\": parsed hour; \"M\": parsed minute; \"S\": parsed second. na, sec_na, min_na, hour_na, mday_na, mon_na, year_na character vector alternative values allow matching. can used indicate different forms missing values found parsing date-time strings.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Parse a date, time, or date-time — parse_dttm_","text":"character matrix six columns: \"year\", \"mon\", \"mday\", \"hour\", \"min\" \"sec\". row corresponds element dttm. element matrix parsed date/time component.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm_fmt.html","id":null,"dir":"Reference","previous_headings":"","what":"Parse a date/time format — parse_dttm_fmt_","title":"Parse a date/time format — parse_dttm_fmt_","text":"parse_dttm_fmt() parses date/time formats, meaning try parse components format fmt refer date/time components. parse_dttm_fmt_() similar parse_dttm_fmt() vectorized fmt.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm_fmt.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parse a date/time format — parse_dttm_fmt_","text":"","code":"parse_dttm_fmt_(fmt, pattern) parse_dttm_fmt(fmt, patterns = fmt_cmp())"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm_fmt.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Parse a date/time format — parse_dttm_fmt_","text":"fmt format string (scalar) parsed patterns. pattern, patterns string (case pattern), character vector (case patterns) regexps individual date/time components. Default value fmt_cmp(). Use function plan passing different set patterns.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/parse_dttm_fmt.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Parse a date/time format — parse_dttm_fmt_","text":"tibble seven columns: fmt_c: date/time format component. Values either \"year\", \"mon\", \"mday\", \"hour\", \"min\", \"sec\", NA. pat: Regexp used parse date/time component. cap: captured substring format. start: Start position format string capture. end: End position format string capture. len: Length capture (number chars). ord: Ordinal date/time component format string. row either date/time format component \"delimiter\" string pattern -format components.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/problems.html","id":null,"dir":"Reference","previous_headings":"","what":"Retrieve date/time parsing problems — problems","title":"Retrieve date/time parsing problems — problems","text":"problems() companion helper function create_iso8601(). retrieves ISO 8601 parsing problems object class iso8601, create_iso8601()'s return value might contain problems attribute case parsing failures. problems() helper function provides easy access parsing problems.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/problems.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Retrieve date/time parsing problems — problems","text":"","code":"problems(x = .Last.value)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/problems.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Retrieve date/time parsing problems — problems","text":"x object class iso8601, typically obtained call create_iso8601(). argument can also left empty, case problems() use last returned value, making convenient use immediately create_iso8601().","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/problems.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Retrieve date/time parsing problems — problems","text":"parsing problems x, returned value NULL; otherwise, tibble parsing failures returned. row corresponds parsing problem. first column named ..indicating position(s) inputs create_iso8601() call resulted failures; remaining columns correspond original input values passed create_iso8601(), columns automatically named ..var1, ..var2, , inputs create_iso8601() unnamed, otherwise, original variable names used instead.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/problems.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Retrieve date/time parsing problems — problems","text":"","code":"dates <- c( \"2020-01-01\", \"2020-02-11\", \"2020-01-06\", \"2020-0921\", \"2020/10/30\", \"2020-12-05\", \"20231225\" ) # By inspecting the problematic dates it can be understood that # the `.format` parameter needs to updated to include other variations. iso8601_dttm <- create_iso8601(dates, .format = \"y-m-d\") problems(iso8601_dttm) #> # A tibble: 3 × 2 #> ..i ..var1 #> #> 1 4 2020-0921 #> 2 5 2020/10/30 #> 3 7 20231225 # Including more parsing formats addresses the previous problems formats <- c(\"y-m-d\", \"y-md\", \"y/m/d\", \"ymd\") iso8601_dttm2 <- create_iso8601(dates, .format = list(formats)) # So now `problems()` returns `NULL` because there are no more parsing issues. problems(iso8601_dttm2) # If you pass named arguments when calling `create_iso8601()` then they will # be used to create the problems object. iso8601_dttm3 <- create_iso8601(date = dates, .format = \"y-m-d\") problems(iso8601_dttm3) #> # A tibble: 3 × 2 #> ..i date #> #> 1 4 2020-0921 #> 2 5 2020/10/30 #> 3 7 20231225"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/pseq.html","id":null,"dir":"Reference","previous_headings":"","what":"Parallel sequence generation — pseq","title":"Parallel sequence generation — pseq","text":"pseq() similar seq() conveniently accepts integer vectors inputs , allowing parallel generation sequences. result union generated sequences.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/pseq.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Parallel sequence generation — pseq","text":"","code":"pseq(from, to)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/pseq.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Parallel sequence generation — pseq","text":"integer vector. starting value(s) sequence(s). integer vector. ending value(s) sequence(s).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/pseq.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Parallel sequence generation — pseq","text":"integer vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec.html","id":null,"dir":"Reference","previous_headings":"","what":"Read in a controlled terminology — read_ct_spec","title":"Read in a controlled terminology — read_ct_spec","text":"read_ct_spec() imports controlled terminology specification data set tibble.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read in a controlled terminology — read_ct_spec","text":"","code":"read_ct_spec(file = cli::cli_abort(\"`file` must be specified\"))"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read in a controlled terminology — read_ct_spec","text":"file path file containing controlled terminology specification data set. following expected file: file expected CSV file; file expected contain first row column names; minimal set variables expected: codelist_code, collected_value, term_synonyms, term_value.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Read in a controlled terminology — read_ct_spec","text":"tibble controlled terminology specification.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read in a controlled terminology — read_ct_spec","text":"","code":"# Get the local path to one of the controlled terminology example files. path <- ct_spec_example(\"ct-01-cm\") # Import it to R. read_ct_spec(file = path) #> # A tibble: 33 × 8 #> codelist_code term_code CodedData term_value collected_value #> #> 1 C71113 C25473 QD QD QD (Every Day) #> 2 C71113 C64496 BID BID BID (Twice a Day) #> 3 C71113 C64499 PRN PRN PRN (As Needed) #> 4 C71113 C64516 Q2H Q2H Q2H (Every 2 Hours) #> 5 C71113 C64530 QID QID QID (4 Times a Day) #> 6 C66726 C25158 CAPSULE CAPSULE Capsule #> 7 C66726 C25394 PILL PILL Pill #> 8 C66726 C29167 LOTION LOTION Lotion #> 9 C66726 C42887 AEROSOL AEROSOL Aerosol #> 10 C66726 C42944 INHALANT INHALANT Inhalant #> # ℹ 23 more rows #> # ℹ 3 more variables: term_preferred_term , term_synonyms , #> # raw_codelist "},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec_example.html","id":null,"dir":"Reference","previous_headings":"","what":"Read an example controlled terminology specification — read_ct_spec_example","title":"Read an example controlled terminology specification — read_ct_spec_example","text":"read_ct_spec_example() imports one bundled controlled terminology specification data sets tibble R.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec_example.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read an example controlled terminology specification — read_ct_spec_example","text":"","code":"read_ct_spec_example(example)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec_example.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read an example controlled terminology specification — read_ct_spec_example","text":"example file name controlled terminology data set bundled {stdm.oak}, run read_ct_spec_example() available example files.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec_example.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Read an example controlled terminology specification — read_ct_spec_example","text":"tibble controlled terminology specification data set, character vector example file names.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_ct_spec_example.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read an example controlled terminology specification — read_ct_spec_example","text":"","code":"# Leave the `example` parameter as missing for available example files. read_ct_spec_example() #> [1] \"ct-01-cm.csv\" # Read an example controlled terminology spec file. read_ct_spec_example(\"ct-01-cm.csv\") #> # A tibble: 33 × 8 #> codelist_code term_code CodedData term_value collected_value #> #> 1 C71113 C25473 QD QD QD (Every Day) #> 2 C71113 C64496 BID BID BID (Twice a Day) #> 3 C71113 C64499 PRN PRN PRN (As Needed) #> 4 C71113 C64516 Q2H Q2H Q2H (Every 2 Hours) #> 5 C71113 C64530 QID QID QID (4 Times a Day) #> 6 C66726 C25158 CAPSULE CAPSULE Capsule #> 7 C66726 C25394 PILL PILL Pill #> 8 C66726 C29167 LOTION LOTION Lotion #> 9 C66726 C42887 AEROSOL AEROSOL Aerosol #> 10 C66726 C42944 INHALANT INHALANT Inhalant #> # ℹ 23 more rows #> # ℹ 3 more variables: term_preferred_term , term_synonyms , #> # raw_codelist # You may omit the file extension. read_ct_spec_example(\"ct-01-cm\") #> # A tibble: 33 × 8 #> codelist_code term_code CodedData term_value collected_value #> #> 1 C71113 C25473 QD QD QD (Every Day) #> 2 C71113 C64496 BID BID BID (Twice a Day) #> 3 C71113 C64499 PRN PRN PRN (As Needed) #> 4 C71113 C64516 Q2H Q2H Q2H (Every 2 Hours) #> 5 C71113 C64530 QID QID QID (4 Times a Day) #> 6 C66726 C25158 CAPSULE CAPSULE Capsule #> 7 C66726 C25394 PILL PILL Pill #> 8 C66726 C29167 LOTION LOTION Lotion #> 9 C66726 C42887 AEROSOL AEROSOL Aerosol #> 10 C66726 C42944 INHALANT INHALANT Inhalant #> # ℹ 23 more rows #> # ℹ 3 more variables: term_preferred_term , term_synonyms , #> # raw_codelist "},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_domain_example.html","id":null,"dir":"Reference","previous_headings":"","what":"Read an example SDTM domain — read_domain_example","title":"Read an example SDTM domain — read_domain_example","text":"read_domain_example() imports one bundled SDTM domain examples tibble R. See domain_example() possible choices.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_domain_example.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Read an example SDTM domain — read_domain_example","text":"","code":"read_domain_example(example)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_domain_example.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Read an example SDTM domain — read_domain_example","text":"example name SDTM domain example, e.g. \"cm\" (Concomitant Medication) \"ae\" (Adverse Events). Run read_domain_example() available example files.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_domain_example.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Read an example SDTM domain — read_domain_example","text":"tibble SDTM domain dataset, character vector example file names.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/read_domain_example.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Read an example SDTM domain — read_domain_example","text":"","code":"# Leave the `example` parameter as missing for available example files. read_domain_example() #> [1] \"ae\" \"apsc\" \"cm\" \"vs\" # Read the example Concomitant Medication domain. read_domain_example(\"cm\") #> # A tibble: 7,510 × 21 #> STUDYID DOMAIN USUBJID CMSEQ CMSPID CMTRT CMDECOD CMINDC CMCLAS CMDOSE CMDOSU #> #> 1 CDISCP… CM 01-701… 1 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 2 CDISCP… CM 01-701… 5 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 3 CDISCP… CM 01-701… 9 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 4 CDISCP… CM 01-701… 13 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 5 CDISCP… CM 01-701… 18 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 6 CDISCP… CM 01-701… 23 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 7 CDISCP… CM 01-701… 28 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 8 CDISCP… CM 01-701… 33 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 9 CDISCP… CM 01-701… 38 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> 10 CDISCP… CM 01-701… 43 1 ASPI… ACETYL… NA NERVO… 1 TABLET #> # ℹ 7,500 more rows #> # ℹ 10 more variables: CMDOSFRQ , CMROUTE , VISITNUM , #> # VISIT , VISITDY , CMDTC , CMSTDTC , CMENDTC , #> # CMSTDY , CMENDY # Read the example Adverse Events domain. read_domain_example(\"ae\") #> # A tibble: 1,191 × 35 #> STUDYID DOMAIN USUBJID AESEQ AESPID AETERM AELLT AELLTCD AEDECOD AEPTCD AEHLT #> #> 1 CDISCP… AE 01-701… 1 E07 APPLI… APPL… NA APPLIC… NA HLT_… #> 2 CDISCP… AE 01-701… 2 E08 APPLI… APPL… NA APPLIC… NA HLT_… #> 3 CDISCP… AE 01-701… 3 E06 DIARR… DIAR… NA DIARRH… NA HLT_… #> 4 CDISCP… AE 01-701… 3 E10 ATRIO… AV B… NA ATRIOV… NA HLT_… #> 5 CDISCP… AE 01-701… 1 E08 ERYTH… ERYT… NA ERYTHE… NA HLT_… #> 6 CDISCP… AE 01-701… 2 E09 ERYTH… LOCA… NA ERYTHE… NA HLT_… #> 7 CDISCP… AE 01-701… 4 E08 ERYTH… ERYT… NA ERYTHE… NA HLT_… #> 8 CDISCP… AE 01-701… 1 E04 APPLI… APPL… NA APPLIC… NA HLT_… #> 9 CDISCP… AE 01-701… 2 E05 APPLI… APPL… NA APPLIC… NA HLT_… #> 10 CDISCP… AE 01-701… 1 E08 APPLI… APPL… NA APPLIC… NA HLT_… #> # ℹ 1,181 more rows #> # ℹ 24 more variables: AEHLTCD , AEHLGT , AEHLGTCD , #> # AEBODSYS , AEBDSYCD , AESOC , AESOCCD , AESEV , #> # AESER , AEACN , AEREL , AEOUT , AESCAN , #> # AESCONG , AESDISAB , AESDTH , AESHOSP , AESLIFE , #> # AESOD , AEDTC , AESTDTC , AEENDTC , AESTDY , #> # AEENDY "},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/recode.html","id":null,"dir":"Reference","previous_headings":"","what":"Recode values — recode","title":"Recode values — recode","text":"recode() recodes values x matching elements onto values .","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/recode.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Recode values — recode","text":"","code":"recode(x, from = unique(na.omit(x)), to = from, .no_match = x, .na = NA)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/recode.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Recode values — recode","text":"x atomic vector values recoded. vector values matched x recoding. vector values used replacement values . .no_match Value used replacement cases matched. .na Value used recode missing values.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/recode.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Recode values — recode","text":"vector recoded values.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/reg_matches.html","id":null,"dir":"Reference","previous_headings":"","what":"regmatches() with NA — reg_matches","title":"regmatches() with NA — reg_matches","text":"reg_matches() thin wrapper around regmatches() returns NA instead character(0) matching fails.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/reg_matches.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"regmatches() with NA — reg_matches","text":"","code":"reg_matches(x, m, invert = FALSE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/reg_matches.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"regmatches() with NA — reg_matches","text":"x character vector. m object match data. invert logical scalar. TRUE, extract replace non-matched substrings.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/reg_matches.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"regmatches() with NA — reg_matches","text":"list character vectors matched substrings, NA matching failed.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/regex_or.html","id":null,"dir":"Reference","previous_headings":"","what":"Utility function to assemble a regex of alternative patterns — regex_or","title":"Utility function to assemble a regex of alternative patterns — regex_or","text":"regex_or() takes set patterns binds (\"|\") pattern easy regex alternative patterns.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/regex_or.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Utility function to assemble a regex of alternative patterns — regex_or","text":"","code":"regex_or(x, .open = FALSE, .close = FALSE)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/regex_or.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Utility function to assemble a regex of alternative patterns — regex_or","text":"x character vector alternative patterns. .open Whether resulting regex start \"|\". .close Whether resulting regex end \"|\".","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/regex_or.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Utility function to assemble a regex of alternative patterns — regex_or","text":"character scalar resulting regex.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/rm_cnd_df.html","id":null,"dir":"Reference","previous_headings":"","what":"Remove the cnd_df class from a data frame — rm_cnd_df","title":"Remove the cnd_df class from a data frame — rm_cnd_df","text":"function removes cnd_df class, along attributes, applicable.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/rm_cnd_df.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Remove the cnd_df class from a data frame — rm_cnd_df","text":"","code":"rm_cnd_df(dat)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/rm_cnd_df.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Remove the cnd_df class from a data frame — rm_cnd_df","text":"dat data frame.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/rm_cnd_df.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Remove the cnd_df class from a data frame — rm_cnd_df","text":"input dat without cnd_df class associated attributes.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sbj_vars.html","id":null,"dir":"Reference","previous_headings":"","what":"Subject-level key variables — sbj_vars","title":"Subject-level key variables — sbj_vars","text":"sbj_vars() returns set variable names uniquely define subject.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sbj_vars.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Subject-level key variables — sbj_vars","text":"","code":"sbj_vars()"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sbj_vars.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Subject-level key variables — sbj_vars","text":"character vector variable names.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sbj_vars.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Subject-level key variables — sbj_vars","text":"","code":"sbj_vars() #> [1] \"STUDYID\" \"USUBJID\""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm.oak-package.html","id":null,"dir":"Reference","previous_headings":"","what":"sdtm.oak: SDTM Data Transformation Engine — sdtm.oak-package","title":"sdtm.oak: SDTM Data Transformation Engine — sdtm.oak-package","text":"EDC Data Standard-agnostic SDTM data transformation engine designed SDTM programming R. Powered metadata sdtm.oak can automate conversion raw clinical data SDTM standardized mapping algorithms. SDTM one required standards data submission FDA (U.S.) PMDA (Japan). SDTM standards implemented accordance SDTM Implementation Guide defined CDISC https://www.cdisc.org/standards/foundational/sdtmig.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm.oak-package.html","id":"author","dir":"Reference","previous_headings":"","what":"Author","title":"sdtm.oak: SDTM Data Transformation Engine — sdtm.oak-package","text":"Maintainer: Rammprasad Ganapathy ganapathy.rammprasad@gene.com Authors: Adam Forys Edgar Manukyan Rosemary Li Preetesh Parikh Lisa Houterloot Yogesh Gupta Omar Garcia ogcalderon@cdisc.org Ramiro Magno rmagno@pattern.institute (ORCID) Kamil Sijko kamil.sijko@ttsi.com.pl (ORCID) Shiyu Chen Shiyu.Chen@atorusresearch.com contributors: Pattern Institute [copyright holder, funder] F. Hoffmann-La Roche AG [copyright holder, funder] Pfizer Inc [copyright holder, funder] Transition Technologies Science [copyright holder, funder]","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_assign.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive an SDTM variable — sdtm_assign","title":"Derive an SDTM variable — sdtm_assign","text":"sdtm_assign() internal function packing functionality assign_no_ct() assign_ct() together aimed developers . user please use either assign_no_ct() assign_ct().","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_assign.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive an SDTM variable — sdtm_assign","text":"","code":"sdtm_assign( tgt_dat = NULL, tgt_var, raw_dat, raw_var, ct_spec = NULL, ct_clst = NULL, id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_assign.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive an SDTM variable — sdtm_assign","text":"tgt_dat Target dataset: data frame merged raw_dat variables indicated id_vars. parameter optional, see section Value output changes depending argument value. tgt_var target SDTM variable: single string indicating name variable derived. raw_dat raw dataset (dataframe); must include variables passed id_vars raw_var. raw_var raw variable: single string indicating name raw variable raw_dat. ct_spec Study controlled terminology specification: dataframe minimal set columns, see ct_spec_vars() details. parameter optional, left NULL controlled terminology recoding applied. ct_clst codelist code indicating subset controlled terminology apply derivation. parameter optional, left NULL, possible recodings ct_spec attempted. id_vars Key variables used join raw dataset (raw_dat) target data set (tgt_dat).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_assign.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive an SDTM variable — sdtm_assign","text":"returned data set depends value tgt_dat: target dataset supplied, meaning tgt_dat defaults NULL, returned data set raw_dat, selected variables indicated id_vars, new extra column: derived variable, indicated tgt_var. target dataset provided, merged raw data set raw_dat variables indicated id_vars, new column: derived variable, indicated tgt_var.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_hardcode.html","id":null,"dir":"Reference","previous_headings":"","what":"Derive an SDTM variable with a hardcoded value — sdtm_hardcode","title":"Derive an SDTM variable with a hardcoded value — sdtm_hardcode","text":"sdtm_hardcode() internal function packing functionality hardcode_no_ct() hardcode_ct() together aimed developers . user please use either hardcode_no_ct() hardcode_ct().","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_hardcode.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Derive an SDTM variable with a hardcoded value — sdtm_hardcode","text":"","code":"sdtm_hardcode( tgt_dat = NULL, tgt_var, raw_dat, raw_var, tgt_val, ct_spec = NULL, ct_clst = NULL, id_vars = oak_id_vars() )"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_hardcode.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Derive an SDTM variable with a hardcoded value — sdtm_hardcode","text":"tgt_dat Target dataset: data frame merged raw_dat variables indicated id_vars. parameter optional, see section Value output changes depending argument value. tgt_var target SDTM variable: single string indicating name variable derived. raw_dat raw dataset (dataframe); must include variables passed id_vars raw_var. raw_var raw variable: single string indicating name raw variable raw_dat. tgt_val target SDTM value hardcoded variable indicated tgt_var. ct_spec Study controlled terminology specification: dataframe minimal set columns, see ct_spec_vars() details. parameter optional, left NULL controlled terminology recoding applied. ct_clst codelist code indicating subset controlled terminology apply derivation. parameter optional, left NULL, possible recodings ct_spec attempted. id_vars Key variables used join raw dataset (raw_dat) target data set (tgt_dat).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_hardcode.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Derive an SDTM variable with a hardcoded value — sdtm_hardcode","text":"returned data set depends value tgt_dat: target dataset supplied, meaning tgt_dat defaults NULL, returned data set raw_dat, selected variables indicated id_vars, new extra column: derived variable, indicated tgt_var. target dataset provided, merged raw data set raw_dat variables indicated id_vars, new column: derived variable, indicated tgt_var.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_join.html","id":null,"dir":"Reference","previous_headings":"","what":"SDTM join — sdtm_join","title":"SDTM join — sdtm_join","text":"sdtm_join() special join raw data set target data set. function supports conditioned data frames. sdtm_join() special join raw data set target data set. function supports conditioned data frames.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_join.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"SDTM join — sdtm_join","text":"","code":"sdtm_join(raw_dat, tgt_dat = NULL, id_vars = oak_id_vars()) sdtm_join(raw_dat, tgt_dat = NULL, id_vars = oak_id_vars())"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_join.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"SDTM join — sdtm_join","text":"raw_dat raw dataset: dataframe conditioned data frame. Must include variables passed id_vars. tgt_dat Target dataset: data frame conditioned data frame merged raw_dat variables indicated id_vars. id_vars Key variables used join raw dataset (raw_dat) target data set (tgt_dat).","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/sdtm_join.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"SDTM join — sdtm_join","text":"data frame, conditioned data frame least one input data sets conditioned data frame. data frame, conditioned data frame , least, one input data sets conditioned data frame.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/str_to_anycase.html","id":null,"dir":"Reference","previous_headings":"","what":"Generate case insensitive regexps — str_to_anycase","title":"Generate case insensitive regexps — str_to_anycase","text":"str_to_anycase() takes character vector word strings input, generates regular expressions express match case.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/str_to_anycase.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Generate case insensitive regexps — str_to_anycase","text":"","code":"str_to_anycase(x)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/str_to_anycase.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Generate case insensitive regexps — str_to_anycase","text":"x character vector strings consisting word characters.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/str_to_anycase.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Generate case insensitive regexps — str_to_anycase","text":"character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/tbl_sum.cnd_df.html","id":null,"dir":"Reference","previous_headings":"","what":"Conditioned tibble header print method — tbl_sum.cnd_df","title":"Conditioned tibble header print method — tbl_sum.cnd_df","text":"Conditioned tibble header print method. S3 method adds extra line header tibble indicates tibble conditioned tibble (# Cond. tbl:) followed tally conditioning vector: number TRUE, FALSE NA values: e.g., 1/1/1.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/tbl_sum.cnd_df.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Conditioned tibble header print method — tbl_sum.cnd_df","text":"","code":"# S3 method for cnd_df tbl_sum(x, ...)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/tbl_sum.cnd_df.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Conditioned tibble header print method — tbl_sum.cnd_df","text":"x conditioned tibble class cnd_df. ... Additional arguments passed default print method.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/tbl_sum.cnd_df.html","id":"ref-examples","dir":"Reference","previous_headings":"","what":"Examples","title":"Conditioned tibble header print method — tbl_sum.cnd_df","text":"","code":"df <- data.frame(x = c(1L, NA_integer_, 3L)) (cnd_df <- condition_add(dat = df, x >= 2L)) #> # A tibble: 3 × 1 #> # Cond. tbl: 1/1/1 #> x #> #> 1 F 1 #> 2 - NA #> 3 T 3 pillar::tbl_sum(cnd_df) #> A tibble Cond. tbl #> \"3 × 1\" \"1/1/1\""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/yy_to_yyyy.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert two-digit to four-digit years — yy_to_yyyy","title":"Convert two-digit to four-digit years — yy_to_yyyy","text":"yy_to_yyyy() converts two-digit years four-digit years.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/yy_to_yyyy.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert two-digit to four-digit years — yy_to_yyyy","text":"","code":"yy_to_yyyy(x, cutoff_2000 = 68L)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/yy_to_yyyy.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert two-digit to four-digit years — yy_to_yyyy","text":"x integer vector years. cutoff_2000 integer value. Two-digit years smaller equal cutoff_2000 parsed though starting 20, otherwise parsed though starting 19.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/yy_to_yyyy.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert two-digit to four-digit years — yy_to_yyyy","text":"integer vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/zero_pad_whole_number.html","id":null,"dir":"Reference","previous_headings":"","what":"Convert an integer to a zero-padded character vector — zero_pad_whole_number","title":"Convert an integer to a zero-padded character vector — zero_pad_whole_number","text":"zero_pad_whole_number() takes non-negative integer values converts character zero padding. Negative numbers numbers greater width specified number digits n converted NA.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/zero_pad_whole_number.html","id":"ref-usage","dir":"Reference","previous_headings":"","what":"Usage","title":"Convert an integer to a zero-padded character vector — zero_pad_whole_number","text":"","code":"zero_pad_whole_number(x, n = 2L)"},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/zero_pad_whole_number.html","id":"arguments","dir":"Reference","previous_headings":"","what":"Arguments","title":"Convert an integer to a zero-padded character vector — zero_pad_whole_number","text":"x integer vector. n Number digits output, including zero padding.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/reference/zero_pad_whole_number.html","id":"value","dir":"Reference","previous_headings":"","what":"Value","title":"Convert an integer to a zero-padded character vector — zero_pad_whole_number","text":"character vector.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/news/index.html","id":"sdtmoak-0009005-development-version","dir":"Changelog","previous_headings":"","what":"sdtm.oak 0.0.0.9005 (development version)","title":"sdtm.oak 0.0.0.9005 (development version)","text":"New function creating conditioned data frames: condition_add(). New pipe operator: %.>% explicit dot placeholder placement. oak_id_vars() now exported function.","code":""},{"path":"https://pharmaverse.github.io/sdtm.oak/news/index.html","id":"sdtmoak-0009004-development-version","dir":"Changelog","previous_headings":"","what":"sdtm.oak 0.0.0.9004 (development version)","title":"sdtm.oak 0.0.0.9004 (development version)","text":"New function: derive_seq() deriving sequence number variable.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/news/index.html","id":"new-features-0-0-0-9003","dir":"Changelog","previous_headings":"","what":"New Features","title":"sdtm.oak 0.0.0.9003 (development version)","text":"New function: assign_datetime() deriving ISO8601 date-time variable.","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/news/index.html","id":"new-features-0-0-0-9002","dir":"Changelog","previous_headings":"","what":"New Features","title":"sdtm.oak 0.0.0.9002 (development version)","text":"New function: derive_study_day() study day calculation. New functions basic SDTM derivations: assign_no_ct(), assign_ct(), hardcode_no_ct() hardcode_ct(). New functions handling controlled terminologies: read_ct_spec(), read_ct_spec_example(), ct_spec_example() ct_map().","code":""},{"path":[]},{"path":"https://pharmaverse.github.io/sdtm.oak/news/index.html","id":"new-features-0-0-0-9001","dir":"Changelog","previous_headings":"","what":"New Features","title":"sdtm.oak 0.0.0.9001 (development version)","text":"New function create_iso8601() conversion vectors dates, times date-times ISO8601 format.","code":""}]