-
Notifications
You must be signed in to change notification settings - Fork 7
/
check_ts_cmdict.R
134 lines (116 loc) · 4 KB
/
check_ts_cmdict.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#' @title Check for missing WHODrug version in TS
#'
#' @description This check looks for missing WHODrug version;
#' if it's present, also checking it's the current version
#'
#' @param TS Trial Summary SDTM dataset with variables TSPARMCD and TSVAL
#'
#' @return boolean value if check failed or passed with 'msg' attribute if the
#' test failed
#'
#' @export
#'
#' @importFrom dplyr %>% filter select pull case_when mutate
#'
#' @author Antony Howard (HackR 2021 Team Pentraxin1)
#'
#' @examples
#'
#' TS1 <- data.frame(
#' STUDYID = 1,
#' TSPARMCD = "CMDICT",
#' TSVAL = "WHODRUG GLOBAL B3 MARCH 1, 2021",
#' TSVAL2 = ""
#' )
#'
#' TS2 <- data.frame(
#' STUDYID = 2,
#' TSPARMCD = "CMDICT",
#' TSVAL = "",
#' TSVAL1 = "WHODRUG GLOBAL B3 MARCH 1, 2021"
#' )
#'
#' TS3 <- data.frame(
#' STUDYID = 3,
#' TSPARMCD = "CMDICT",
#' TSVAL = ""
#' )
#'
#' TS4 <-data.frame(
#' STUDYID = 4,
#' TSPARMCD = "AEDICT",
#' TSVAL = ""
#' )
#'
#' TS5 <- data.frame(
#' STUDYID = 5,
#' TSPARMCD = "CMDICT",
#' TSVAL = "meddra 24.0",
#' TSVAL2 = ""
#' )
#'
#' TS6 <- data.frame(
#' STUDYID = 6,
#' TSPARMCD = "CMDICT",
#' TSVAL = "WHODRUG vGLOBAL B3 MARCH 1, 2021",
#' TSVAL2 = ""
#' )
#'
#' check_ts_cmdict(TS1)
#' check_ts_cmdict(TS2)
#' check_ts_cmdict(TS3)
#' check_ts_cmdict(TS4)
#' check_ts_cmdict(TS5)
#' check_ts_cmdict(TS6)
#' check_ts_cmdict(rbind(TS1,TS1))
check_ts_cmdict <- function(TS){
###First check that required variables exist and return a message if they don't
if(TS %lacks_any% c("TSPARMCD", "TSVAL")){
fail(lacks_msg(TS, c("TSPARMCD", "TSVAL")))
}else{
### identify current WHODrug version
t <- Sys.Date()
y <- substring(t,1,4)
may <- seq(as.Date(paste0(y, "-05-01")),as.Date(paste0(y, "-05-07")),by="1 day")
date1 <- may[weekdays(may) == "Monday"]
nov <- seq(as.Date(paste0(y, "-11-01")),as.Date(paste0(y, "-11-07")),by="1 day")
date2 <- nov[weekdays(nov) == "Monday"]
# Work out the main WHODrug version of the year eg March 1, 2021
# if today is before the first Monday of May, WHODrug version is the previous version, ie SEPTEMBER 1, 2020
# if today is after the first Monday of November, WHODrug version is the next version, ie SEPTEMBER 1, 2021
whodrug_ver <- case_when(t < date1 ~ paste0("SEPTEMBER 1, ", as.numeric(y)-1),
t >= date1 & t< date2 ~ paste0("MARCH 1, ", as.numeric(y)),
t>= date2 ~ paste0("SEPTEMBER 1, ", as.numeric(y))
)
version <- paste0("WHODRUG GLOBAL B3 ",whodrug_ver)
### Subset TS to only CMDICT record
mydf <- subset(TS, TS$TSPARMCD=="CMDICT", c("TSPARMCD","TSVAL"))
###Print to report
### Pass if WHODrug version is populated
if (nrow(mydf) == 1) {
###Adding calculated WHODrug Version so it is included in the dataframe that is returned if the check fails
mydf <- mydf %>%
mutate(Current_WHODRUG_ver = version)
whodrug=mydf %>% select(TSVAL) %>%
pull() %>% trimws()
if (is_sas_na(whodrug)) {
fail("No value in TS.TSVAL where TS.TSPARMCD=CMDICT. ", mydf)
}
else if(toupper(whodrug) != toupper(version) ){
fail(paste("WHODrug version in TS.TSVAL where TS.TSPARMCD=CMDICT is not latest version as of",Sys.Date(),"or not an exact string match."), mydf)
}
else {
if (grepl("WHODRUG", toupper(mydf$TSVAL), ignore.case=TRUE)) {
pass()
} else {
fail("The string `WHODRUG` not found in TS.TSVAL where TS.TSPARMCD=CMDICT. ", mydf)
}
}
### Return message if WHODrug version is not populated in TS
}else if (nrow(mydf) < 1){
fail("No record where TS.TSPARMCD=CMDICT. ")
}else if (nrow(mydf) > 1){
fail("Multiple records where TS.TSPARMCD=CMDICT. ",mydf)
}
}
}