I ran and little bit modified code from Grahame Grieve Orignal code starts below (with some notes and modifications)
This session was solicited by Doug Fridsma.
Taught by Grahame Grieve.
The workshop uses POSTMan (https://www.getpostman.com/downloads/)
The actual R exercises have been preceded with examples of querying mimic data using FHIR.
See hapifhir.io for a Hapi server.
Load all the libraries.
#install.packages('httpuv')
library(httpuv)
library(devtools)
# install_github("FirelyTeam/RonFHIR")
library(RonFHIR)
library(stringr)
library(ggplot2)
library(DT);library(dplyr);library(purrr)
#version in sessioninfo at the bottom
Open client connection
client <- fhirClient$new("http://mimic.fhir.org/r3")
## Warning: The endpoint requires authorization.
Simple search
bundle <- client$search("Patient", c("gender=female", "birthdate=gt2082-06-27"))
What did we get back?
class(bundle)
## [1] "list"
names(bundle)
## [1] "resourceType" "id" "meta" "type"
## [5] "total" "link" "entry"
summary(bundle)
## Length Class Mode
## resourceType 1 -none- character
## id 1 -none- character
## meta 1 -none- list
## type 1 -none- character
## total 1 -none- numeric
## link 2 data.frame list
## entry 3 data.frame list
#bundle$entry
nice<-bundle$entry %>% select_if(purrr::negate(is.list))
DT::datatable(nice)
#knitr::kable()
# Don't do this; you'll flood your screen
#str(bundle)
Summary of the number of records and matches
paste("Number of matching patients =", bundle$total)
## [1] "Number of matching patients = 19"
paste("Number of records =", dim(bundle$entry)[1])
## [1] "Number of records = 19"
Print the records gender and date of birth (my solution)
paste(bundle$entry$resource$gender,
bundle$entry$resource$birthDate,
unlist(lapply(bundle$entry$resource$extension, "[", 1, 2)),
sep=",")
## [1] "female,2110-04-02,PROTESTANT QUAKER"
## [2] "female,2097-11-14,UNOBTAINABLE"
## [3] "female,2112-01-20,PROTESTANT QUAKER"
## [4] "female,2097-05-16,CATHOLIC"
## [5] "female,2104-02-12,CATHOLIC"
## [6] "female,2112-10-22,NOT SPECIFIED"
## [7] "female,2094-03-05,CATHOLIC"
## [8] "female,2090-06-05,CATHOLIC"
## [9] "female,2108-01-15,CATHOLIC"
## [10] "female,2141-03-15,CATHOLIC"
## [11] "female,2111-07-18,CATHOLIC"
## [12] "female,2146-10-23,UNKNOWN/NOT SPECIFIED"
## [13] "female,2110-03-25,CATHOLIC"
## [14] "female,2150-12-07,UNOBTAINABLE"
## [15] "female,2097-01-16,CATHOLIC"
## [16] "female,2099-03-17,PROTESTANT QUAKER"
## [17] "female,2108-12-20,JEWISH"
## [18] "female,2127-06-04,UNOBTAINABLE"
## [19] "female,2181-04-19,NOT SPECIFIED"
Logic behind my solution:
class(bundle$entry)
## [1] "data.frame"
names(bundle$entry)
## [1] "fullUrl" "resource" "search"
class(bundle$entry$resource)
## [1] "data.frame"
names(bundle$entry$resource)
## [1] "resourceType" "id" "meta"
## [4] "text" "extension" "identifier"
## [7] "gender" "birthDate" "deceasedDateTime"
## [10] "maritalStatus" "communication"
class(bundle$entry$resource$gender)
## [1] "character"
class(bundle$entry$resource$birthDate)
## [1] "character"
We’ll need a function to extract religion.
getReligion <- function(extl) {
for (io in extl) {
for (i in 1:nrow(io)) {
if (io[i, "url"] == "http://hl7.org/fhir/StructureDefinition/patient-religion") {
v <- io[i, "valueCodeableConcept"];
return (v$text);
}
}
}
return ("??")
}
Print the records gender and date of birth (Grahame’s solution)
for(row in 1:nrow(bundle$entry)) {
res <-bundle$entry[row, "resource"]
print(paste(res$gender, res$birthDate,
getReligion(res$extension), sep = ","))
}
## [1] "female,2110-04-02,PROTESTANT QUAKER"
## [1] "female,2097-11-14,UNOBTAINABLE"
## [1] "female,2112-01-20,PROTESTANT QUAKER"
## [1] "female,2097-05-16,CATHOLIC"
## [1] "female,2104-02-12,CATHOLIC"
## [1] "female,2112-10-22,NOT SPECIFIED"
## [1] "female,2094-03-05,CATHOLIC"
## [1] "female,2090-06-05,CATHOLIC"
## [1] "female,2108-01-15,CATHOLIC"
## [1] "female,2141-03-15,CATHOLIC"
## [1] "female,2111-07-18,CATHOLIC"
## [1] "female,2146-10-23,??"
## [1] "female,2110-03-25,CATHOLIC"
## [1] "female,2150-12-07,UNOBTAINABLE"
## [1] "female,2097-01-16,CATHOLIC"
## [1] "female,2099-03-17,PROTESTANT QUAKER"
## [1] "female,2108-12-20,JEWISH"
## [1] "female,2127-06-04,UNOBTAINABLE"
## [1] "female,2181-04-19,NOT SPECIFIED"
Specify a search with 30 records per page
bundle <- client$search("Patient", c("_count=30"))
class(bundle)
## [1] "list"
names(bundle)
## [1] "resourceType" "id" "meta" "type"
## [5] "total" "link" "entry"
class(client)
## [1] "fhirClient" "R6"
names(client)
## [1] ".__enclos_env__" "registerUrl" "authUrl"
## [4] "tokenUrl" "token" "endpoint"
## [7] "clone" "setToken" "print"
## [10] "update" "operation" "continue"
## [13] "qraphQL" "searchByQuery" "wholeSystemSearch"
## [16] "searchById" "search" "read"
## [19] "initialize"
class(client$continue)
## [1] "function"
while(!is.null(bundle)) {
print(c("================================= Number of records=",
dim(bundle$entry)[1]))
print(
paste(bundle$entry$resource$gender,
bundle$entry$resource$birthDate,
unlist(lapply(bundle$entry$resource$extension, "[", 1, 2)),
sep=","))
# Go to the next page of the bundle using FHIRs paging mechanism
bundle <- client$continue(bundle)
}
## [1] "================================= Number of records="
## [2] "30"
## [1] "female,2063-07-05,CATHOLIC"
## [2] "male,2082-06-27,CATHOLIC"
## [3] "male,2079-08-17,CHRISTIAN SCIENTIST"
## [4] "female,2070-10-11,NOT SPECIFIED"
## [5] "female,2110-04-02,PROTESTANT QUAKER"
## [6] "male,2086-12-16,PROTESTANT QUAKER"
## [7] "male,2103-12-05,CATHOLIC"
## [8] "female,2031-08-12,CATHOLIC"
## [9] "female,2097-11-14,UNOBTAINABLE"
## [10] "female,2068-03-04,JEWISH"
## [11] "female,2112-01-20,PROTESTANT QUAKER"
## [12] "female,2073-08-13,NOT SPECIFIED"
## [13] "female,1844-07-18,JEWISH"
## [14] "female,2073-06-05,NOT SPECIFIED"
## [15] "male,2096-07-25,NOT SPECIFIED"
## [16] "male,2090-11-16,CATHOLIC"
## [17] "male,2136-07-28,CATHOLIC"
## [18] "female,1851-09-12,UNOBTAINABLE"
## [19] "female,2045-10-07,ROMANIAN EAST. ORTH"
## [20] "male,2061-06-13,CATHOLIC"
## [21] "male,2086-02-04,UNOBTAINABLE"
## [22] "male,2083-09-20,MUSLIM"
## [23] "female,2044-06-27,PROTESTANT QUAKER"
## [24] "female,2016-12-05,CATHOLIC"
## [25] "male,2058-08-04,CATHOLIC"
## [26] "female,2051-03-23,NOT SPECIFIED"
## [27] "male,2098-04-29,CATHOLIC"
## [28] "female,2074-09-29,NOT SPECIFIED"
## [29] "female,2041-05-16,OTHER"
## [30] "female,2072-12-03,NOT SPECIFIED"
## [1] "================================= Number of records="
## [2] "30"
## [1] "female,2060-02-12,JEWISH"
## [2] "male,2079-01-29,JEWISH"
## [3] "male,2061-12-10,CHRISTIAN SCIENTIST"
## [4] "male,1846-07-21,JEWISH"
## [5] "male,2046-07-05,CATHOLIC"
## [6] "female,2029-12-07,JEWISH"
## [7] "male,2099-09-02,JEWISH"
## [8] "male,2097-01-07,CATHOLIC"
## [9] "male,2136-07-29,CATHOLIC"
## [10] "female,1876-07-14,CATHOLIC"
## [11] "female,2097-05-16,CATHOLIC"
## [12] "female,2051-07-25,PROTESTANT QUAKER"
## [13] "male,2051-03-24,NOT SPECIFIED"
## [14] "female,2073-11-22,UNOBTAINABLE"
## [15] "female,2104-02-12,CATHOLIC"
## [16] "male,2057-11-15,CATHOLIC"
## [17] "male,1878-05-14,PROTESTANT QUAKER"
## [18] "female,2078-06-16,UNOBTAINABLE"
## [19] "male,2107-06-27,CATHOLIC"
## [20] "female,2112-10-22,NOT SPECIFIED"
## [21] "female,2094-03-05,CATHOLIC"
## [22] "female,2090-06-05,CATHOLIC"
## [23] "female,2038-09-03,CATHOLIC"
## [24] "female,2075-09-21,CATHOLIC"
## [25] "male,2114-06-20,CATHOLIC"
## [26] "female,1895-05-17,OTHER"
## [27] "female,2108-01-15,CATHOLIC"
## [28] "male,2061-04-10,PROTESTANT QUAKER"
## [29] "male,2050-03-29,CATHOLIC"
## [30] "female,2051-04-21,CATHOLIC"
## [1] "================================= Number of records="
## [2] "30"
## [1] "male,2053-04-13,NOT SPECIFIED"
## [2] "female,1885-03-24,JEWISH"
## [3] "female,2056-01-27,CATHOLIC"
## [4] "female,2061-10-23,UNOBTAINABLE"
## [5] "male,2076-05-06,UNOBTAINABLE"
## [6] "male,2109-04-07,CATHOLIC"
## [7] "female,2071-02-11,UNOBTAINABLE"
## [8] "female,2061-03-25,PROTESTANT QUAKER"
## [9] "female,2141-03-15,CATHOLIC"
## [10] "female,2046-02-27,CHRISTIAN SCIENTIST"
## [11] "male,2081-01-03,CATHOLIC"
## [12] "female,2031-05-19,CATHOLIC"
## [13] "male,2058-04-23,UNOBTAINABLE"
## [14] "female,2111-07-18,CATHOLIC"
## [15] "male,2101-06-10,UNOBTAINABLE"
## [16] "female,2146-10-23,UNKNOWN/NOT SPECIFIED"
## [17] "male,2081-12-26,OTHER"
## [18] "male,2038-05-10,NOT SPECIFIED"
## [19] "female,2110-03-25,CATHOLIC"
## [20] "male,2029-07-09,UNOBTAINABLE"
## [21] "male,2046-04-18,UNOBTAINABLE"
## [22] "male,2096-02-27,NOT SPECIFIED"
## [23] "male,2053-09-08,UNOBTAINABLE"
## [24] "male,1880-02-29,UNOBTAINABLE"
## [25] "female,2150-12-07,UNOBTAINABLE"
## [26] "male,2055-07-18,NOT SPECIFIED"
## [27] "male,2035-04-13,CATHOLIC"
## [28] "female,2050-02-16,BUDDHIST"
## [29] "male,2097-12-16,CATHOLIC"
## [30] "female,2097-01-16,CATHOLIC"
## [1] "================================= Number of records="
## [2] "10"
## [1] "female,2069-05-05,PROTESTANT QUAKER"
## [2] "female,2099-03-17,PROTESTANT QUAKER"
## [3] "female,2072-05-05,CATHOLIC"
## [4] "male,2036-03-10,NOT SPECIFIED"
## [5] "male,2088-05-05,OTHER"
## [6] "female,2108-12-20,JEWISH"
## [7] "female,2127-06-04,UNOBTAINABLE"
## [8] "female,2181-04-19,NOT SPECIFIED"
## [9] "male,2109-07-08,CATHOLIC"
## [10] "female,2058-04-23,CATHOLIC"
What are we doing here?
res <- client$qraphQL('{PatientList(){
gender birthDate religion:
extension(url :
"http://hl7.org/fhir/StructureDefinition/patient-religion")
{value : valueCodeableConcept { text } } }}');
pl <- res$data$PatientList
pl
## gender birthDate religion
## 1 female 2112-10-22 NOT SPECIFIED
## 2 male 2107-06-27 CATHOLIC
## 3 female 2078-06-16 UNOBTAINABLE
## 4 male 1878-05-14 PROTESTANT QUAKER
## 5 male 2057-11-15 CATHOLIC
## 6 female 2104-02-12 CATHOLIC
## 7 female 2073-11-22 UNOBTAINABLE
## 8 male 2051-03-24 NOT SPECIFIED
## 9 female 2051-07-25 PROTESTANT QUAKER
## 10 female 2097-05-16 CATHOLIC
## 11 female 1876-07-14 CATHOLIC
## 12 male 2136-07-29 CATHOLIC
## 13 male 2097-01-07 CATHOLIC
## 14 male 2099-09-02 JEWISH
## 15 female 2029-12-07 JEWISH
## 16 male 2046-07-05 CATHOLIC
## 17 male 1846-07-21 JEWISH
## 18 male 2061-12-10 CHRISTIAN SCIENTIST
## 19 male 2079-01-29 JEWISH
## 20 female 2060-02-12 JEWISH
## 21 female 2072-12-03 NOT SPECIFIED
## 22 female 2041-05-16 OTHER
## 23 female 2074-09-29 NOT SPECIFIED
## 24 male 2098-04-29 CATHOLIC
## 25 female 2051-03-23 NOT SPECIFIED
## 26 male 2058-08-04 CATHOLIC
## 27 female 2016-12-05 CATHOLIC
## 28 female 2044-06-27 PROTESTANT QUAKER
## 29 male 2083-09-20 MUSLIM
## 30 male 2086-02-04 UNOBTAINABLE
## 31 male 2061-06-13 CATHOLIC
## 32 female 2045-10-07 ROMANIAN EAST. ORTH
## 33 female 1851-09-12 UNOBTAINABLE
## 34 male 2136-07-28 CATHOLIC
## 35 male 2090-11-16 CATHOLIC
## 36 male 2096-07-25 NOT SPECIFIED
## 37 female 2073-06-05 NOT SPECIFIED
## 38 female 1844-07-18 JEWISH
## 39 female 2073-08-13 NOT SPECIFIED
## 40 female 2112-01-20 PROTESTANT QUAKER
## 41 female 2068-03-04 JEWISH
## 42 female 2097-11-14 UNOBTAINABLE
## 43 female 2031-08-12 CATHOLIC
## 44 male 2103-12-05 CATHOLIC
## 45 male 2086-12-16 PROTESTANT QUAKER
## 46 female 2110-04-02 PROTESTANT QUAKER
## 47 female 2070-10-11 NOT SPECIFIED
## 48 male 2079-08-17 CHRISTIAN SCIENTIST
## 49 male 2082-06-27 CATHOLIC
## 50 female 2063-07-05 CATHOLIC
## 51 female 2058-04-23 CATHOLIC
## 52 male 2109-07-08 CATHOLIC
## 53 female 2181-04-19 NOT SPECIFIED
## 54 female 2127-06-04 UNOBTAINABLE
## 55 female 2108-12-20 JEWISH
## 56 male 2088-05-05 OTHER
## 57 male 2036-03-10 NOT SPECIFIED
## 58 female 2072-05-05 CATHOLIC
## 59 female 2099-03-17 PROTESTANT QUAKER
## 60 female 2069-05-05 PROTESTANT QUAKER
## 61 female 2097-01-16 CATHOLIC
## 62 male 2097-12-16 CATHOLIC
## 63 female 2050-02-16 BUDDHIST
## 64 male 2035-04-13 CATHOLIC
## 65 male 2055-07-18 NOT SPECIFIED
## 66 female 2150-12-07 UNOBTAINABLE
## 67 male 1880-02-29 UNOBTAINABLE
## 68 male 2053-09-08 UNOBTAINABLE
## 69 male 2096-02-27 NOT SPECIFIED
## 70 male 2046-04-18 UNOBTAINABLE
## 71 male 2029-07-09 UNOBTAINABLE
## 72 female 2110-03-25 CATHOLIC
## 73 male 2038-05-10 NOT SPECIFIED
## 74 male 2081-12-26 OTHER
## 75 female 2146-10-23 NULL
## 76 male 2101-06-10 UNOBTAINABLE
## 77 female 2111-07-18 CATHOLIC
## 78 male 2058-04-23 UNOBTAINABLE
## 79 female 2031-05-19 CATHOLIC
## 80 male 2081-01-03 CATHOLIC
## 81 female 2046-02-27 CHRISTIAN SCIENTIST
## 82 female 2141-03-15 CATHOLIC
## 83 female 2061-03-25 PROTESTANT QUAKER
## 84 female 2071-02-11 UNOBTAINABLE
## 85 male 2109-04-07 CATHOLIC
## 86 male 2076-05-06 UNOBTAINABLE
## 87 female 2061-10-23 UNOBTAINABLE
## 88 female 2056-01-27 CATHOLIC
## 89 female 1885-03-24 JEWISH
## 90 male 2053-04-13 NOT SPECIFIED
## 91 female 2051-04-21 CATHOLIC
## 92 male 2050-03-29 CATHOLIC
## 93 male 2061-04-10 PROTESTANT QUAKER
## 94 female 2108-01-15 CATHOLIC
## 95 female 1895-05-17 OTHER
## 96 male 2114-06-20 CATHOLIC
## 97 female 2075-09-21 CATHOLIC
## 98 female 2038-09-03 CATHOLIC
## 99 female 2090-06-05 CATHOLIC
## 100 female 2094-03-05 CATHOLIC
Note that religion did not print. See the magic below to make it work.
res <- client$qraphQL('{PatientList(){
gender birthDate religion:
extension(url :
"http://hl7.org/fhir/StructureDefinition/patient-religion")
@flatten {value : valueCodeableConcept
@flatten { religion: text } } }}');
pl <- res$data$PatientList
easy now…
pl
## gender birthDate religion
## 1 female 2112-10-22 NOT SPECIFIED
## 2 male 2107-06-27 CATHOLIC
## 3 female 2078-06-16 UNOBTAINABLE
## 4 male 1878-05-14 PROTESTANT QUAKER
## 5 male 2057-11-15 CATHOLIC
## 6 female 2104-02-12 CATHOLIC
## 7 female 2073-11-22 UNOBTAINABLE
## 8 male 2051-03-24 NOT SPECIFIED
## 9 female 2051-07-25 PROTESTANT QUAKER
## 10 female 2097-05-16 CATHOLIC
## 11 female 1876-07-14 CATHOLIC
## 12 male 2136-07-29 CATHOLIC
## 13 male 2097-01-07 CATHOLIC
## 14 male 2099-09-02 JEWISH
## 15 female 2029-12-07 JEWISH
## 16 male 2046-07-05 CATHOLIC
## 17 male 1846-07-21 JEWISH
## 18 male 2061-12-10 CHRISTIAN SCIENTIST
## 19 male 2079-01-29 JEWISH
## 20 female 2060-02-12 JEWISH
## 21 female 2072-12-03 NOT SPECIFIED
## 22 female 2041-05-16 OTHER
## 23 female 2074-09-29 NOT SPECIFIED
## 24 male 2098-04-29 CATHOLIC
## 25 female 2051-03-23 NOT SPECIFIED
## 26 male 2058-08-04 CATHOLIC
## 27 female 2016-12-05 CATHOLIC
## 28 female 2044-06-27 PROTESTANT QUAKER
## 29 male 2083-09-20 MUSLIM
## 30 male 2086-02-04 UNOBTAINABLE
## 31 male 2061-06-13 CATHOLIC
## 32 female 2045-10-07 ROMANIAN EAST. ORTH
## 33 female 1851-09-12 UNOBTAINABLE
## 34 male 2136-07-28 CATHOLIC
## 35 male 2090-11-16 CATHOLIC
## 36 male 2096-07-25 NOT SPECIFIED
## 37 female 2073-06-05 NOT SPECIFIED
## 38 female 1844-07-18 JEWISH
## 39 female 2073-08-13 NOT SPECIFIED
## 40 female 2112-01-20 PROTESTANT QUAKER
## 41 female 2068-03-04 JEWISH
## 42 female 2097-11-14 UNOBTAINABLE
## 43 female 2031-08-12 CATHOLIC
## 44 male 2103-12-05 CATHOLIC
## 45 male 2086-12-16 PROTESTANT QUAKER
## 46 female 2110-04-02 PROTESTANT QUAKER
## 47 female 2070-10-11 NOT SPECIFIED
## 48 male 2079-08-17 CHRISTIAN SCIENTIST
## 49 male 2082-06-27 CATHOLIC
## 50 female 2063-07-05 CATHOLIC
## 51 female 2058-04-23 CATHOLIC
## 52 male 2109-07-08 CATHOLIC
## 53 female 2181-04-19 NOT SPECIFIED
## 54 female 2127-06-04 UNOBTAINABLE
## 55 female 2108-12-20 JEWISH
## 56 male 2088-05-05 OTHER
## 57 male 2036-03-10 NOT SPECIFIED
## 58 female 2072-05-05 CATHOLIC
## 59 female 2099-03-17 PROTESTANT QUAKER
## 60 female 2069-05-05 PROTESTANT QUAKER
## 61 female 2097-01-16 CATHOLIC
## 62 male 2097-12-16 CATHOLIC
## 63 female 2050-02-16 BUDDHIST
## 64 male 2035-04-13 CATHOLIC
## 65 male 2055-07-18 NOT SPECIFIED
## 66 female 2150-12-07 UNOBTAINABLE
## 67 male 1880-02-29 UNOBTAINABLE
## 68 male 2053-09-08 UNOBTAINABLE
## 69 male 2096-02-27 NOT SPECIFIED
## 70 male 2046-04-18 UNOBTAINABLE
## 71 male 2029-07-09 UNOBTAINABLE
## 72 female 2110-03-25 CATHOLIC
## 73 male 2038-05-10 NOT SPECIFIED
## 74 male 2081-12-26 OTHER
## 75 female 2146-10-23 <NA>
## 76 male 2101-06-10 UNOBTAINABLE
## 77 female 2111-07-18 CATHOLIC
## 78 male 2058-04-23 UNOBTAINABLE
## 79 female 2031-05-19 CATHOLIC
## 80 male 2081-01-03 CATHOLIC
## 81 female 2046-02-27 CHRISTIAN SCIENTIST
## 82 female 2141-03-15 CATHOLIC
## 83 female 2061-03-25 PROTESTANT QUAKER
## 84 female 2071-02-11 UNOBTAINABLE
## 85 male 2109-04-07 CATHOLIC
## 86 male 2076-05-06 UNOBTAINABLE
## 87 female 2061-10-23 UNOBTAINABLE
## 88 female 2056-01-27 CATHOLIC
## 89 female 1885-03-24 JEWISH
## 90 male 2053-04-13 NOT SPECIFIED
## 91 female 2051-04-21 CATHOLIC
## 92 male 2050-03-29 CATHOLIC
## 93 male 2061-04-10 PROTESTANT QUAKER
## 94 female 2108-01-15 CATHOLIC
## 95 female 1895-05-17 OTHER
## 96 male 2114-06-20 CATHOLIC
## 97 female 2075-09-21 CATHOLIC
## 98 female 2038-09-03 CATHOLIC
## 99 female 2090-06-05 CATHOLIC
## 100 female 2094-03-05 CATHOLIC
Need lots of information from the server:
* App-Name: (“Mimic” for Mimic Server)
* Client-Id: (c.5 for Mimic server)
* Client-Secret: (cfe2cc3e-d4ca-49f4-8366-10064f4eda5c for Mimic server)
* Auth-Endpoint: https://mimic.fhir.org/r3/auth/auth
* Token-Endpoint: https://mimic.fhir.org/r3/auth/token
* Username / Password: REDACTED
VH: This does work when run outside R Markdown. It opens a browser. Not sure if picking a patient is important.
client <- fhirClient$new("https://mimic.fhir.org/r3");
app <- httr::oauth_app(appname = "Mimic",
"c.5",
"cfe2cc3e-d4ca-49f4-8366-10064f4eda5c")
scopes <- c("patient/*.read")
oauth_endpoint <-
httr::oauth_endpoint(authorize =
paste("https://mimic.fhir.org/r3/auth/auth",
"?aud=", "https://mimic.fhir.org/r3",
"&state=", runif(1), sep=""),
access = "https://mimic.fhir.org/r3/auth/token")
#VH: I set cache to false (to avoid the question, not sure here)
token <- httr::oauth2.0_token(endpoint = oauth_endpoint,
app = app, scope = scopes,cache = FALSE)
client$setToken(token$credentials$access_token)
Here we will build historic \(O_2\) saturation dataset for a patient.
We’ll need a couple of functions to do date format conversion.
fixDateTime <- function (s) {
if(nchar(s) == 10) {
return (paste(s, "00:00:00"));
} else {
return (str_replace(s,"T", " "));
}
}
fixDateTime2 <- function (s) {
ifelse(nchar(s) == 10, paste(s, "00:00:00"), sub("T", " ", s))
}
client <- fhirClient$new("http://mimic.fhir.org/r3")
## Warning: The endpoint requires authorization.
bundle <- client$search("Observation",
c("code=2708-6",
"subject=Patient/30831",
"date=lt2130-08-01"))
dateList <- list();
valueList <- list();
index <- 1
while(!is.null(bundle)) {
for(row in 1:nrow(bundle$entry)) {
res <-bundle$entry[row, "resource"]
dateList[index] = fixDateTime(res$effectiveDateTime);
valueList[index] = res$valueQuantity$value;
index = index+1;
}
bundle <- client$continue(bundle)
}
df <- do.call(rbind,
Map(data.frame,
DATE=dateList,
SAT=valueList))
df
## DATE SAT
## 1 2130-02-04 04:42:00 100
## 2 2130-02-04 05:03:00 99
## 3 2130-02-04 06:00:00 100
## 4 2130-02-04 07:14:00 100
## 5 2130-02-04 08:00:00 98
## 6 2130-02-04 08:17:00 85
## 7 2130-02-04 09:00:00 100
## 8 2130-02-04 09:52:00 96
## 9 2130-02-04 10:00:00 100
## 10 2130-02-04 10:50:00 98
## 11 2130-02-04 11:00:00 98
## 12 2130-02-04 12:00:00 100
## 13 2130-02-04 13:03:00 95
## 14 2130-02-04 14:00:00 100
## 15 2130-02-04 15:00:00 99
## 16 2130-02-04 16:00:00 100
## 17 2130-02-04 17:34:00 99
## 18 2130-02-04 18:00:00 98
## 19 2130-02-04 19:00:00 98
## 20 2130-02-04 20:00:00 92
## 21 2130-02-04 21:00:00 93
## 22 2130-02-04 22:00:00 91
## 23 2130-02-04 23:00:00 91
## 24 2130-02-05 00:00:00 93
## 25 2130-02-05 01:00:00 93
## 26 2130-02-05 02:00:00 99
## 27 2130-02-05 03:00:00 98
## 28 2130-02-05 04:00:00 97
## 29 2130-02-05 05:00:00 98
## 30 2130-02-05 06:07:00 97
## 31 2130-02-05 07:00:00 99
## 32 2130-02-05 08:00:00 96
## 33 2130-02-05 09:31:00 98
## 34 2130-02-05 10:00:00 93
## 35 2130-02-05 11:00:00 98
## 36 2130-02-05 12:00:00 98
## 37 2130-02-05 13:00:00 100
## 38 2130-02-05 14:00:00 100
## 39 2130-02-05 15:00:00 100
## 40 2130-02-05 16:00:00 98
## 41 2130-02-05 17:44:00 95
## 42 2130-02-05 18:00:00 97
## 43 2130-02-05 19:00:00 97
## 44 2130-02-05 20:00:00 97
## 45 2130-02-05 21:00:00 98
## 46 2130-02-05 22:00:00 98
## 47 2130-02-05 23:36:00 100
## 48 2130-02-06 00:00:00 100
## 49 2130-02-06 01:00:00 100
## 50 2130-02-06 02:00:00 100
## 51 2130-02-06 03:00:00 97
## 52 2130-02-06 04:00:00 97
## 53 2130-02-06 05:00:00 98
## 54 2130-02-06 06:00:00 100
## 55 2130-02-06 07:00:00 100
## 56 2130-02-06 08:00:00 99
## 57 2130-02-06 09:00:00 100
## 58 2130-02-06 10:00:00 100
## 59 2130-02-06 11:01:00 99
df$DATET <- as.POSIXct(df$DATE,tz=Sys.timezone())
df
## DATE SAT DATET
## 1 2130-02-04 04:42:00 100 2130-02-04 04:42:00
## 2 2130-02-04 05:03:00 99 2130-02-04 05:03:00
## 3 2130-02-04 06:00:00 100 2130-02-04 06:00:00
## 4 2130-02-04 07:14:00 100 2130-02-04 07:14:00
## 5 2130-02-04 08:00:00 98 2130-02-04 08:00:00
## 6 2130-02-04 08:17:00 85 2130-02-04 08:17:00
## 7 2130-02-04 09:00:00 100 2130-02-04 09:00:00
## 8 2130-02-04 09:52:00 96 2130-02-04 09:52:00
## 9 2130-02-04 10:00:00 100 2130-02-04 10:00:00
## 10 2130-02-04 10:50:00 98 2130-02-04 10:50:00
## 11 2130-02-04 11:00:00 98 2130-02-04 11:00:00
## 12 2130-02-04 12:00:00 100 2130-02-04 12:00:00
## 13 2130-02-04 13:03:00 95 2130-02-04 13:03:00
## 14 2130-02-04 14:00:00 100 2130-02-04 14:00:00
## 15 2130-02-04 15:00:00 99 2130-02-04 15:00:00
## 16 2130-02-04 16:00:00 100 2130-02-04 16:00:00
## 17 2130-02-04 17:34:00 99 2130-02-04 17:34:00
## 18 2130-02-04 18:00:00 98 2130-02-04 18:00:00
## 19 2130-02-04 19:00:00 98 2130-02-04 19:00:00
## 20 2130-02-04 20:00:00 92 2130-02-04 20:00:00
## 21 2130-02-04 21:00:00 93 2130-02-04 21:00:00
## 22 2130-02-04 22:00:00 91 2130-02-04 22:00:00
## 23 2130-02-04 23:00:00 91 2130-02-04 23:00:00
## 24 2130-02-05 00:00:00 93 2130-02-05 00:00:00
## 25 2130-02-05 01:00:00 93 2130-02-05 01:00:00
## 26 2130-02-05 02:00:00 99 2130-02-05 02:00:00
## 27 2130-02-05 03:00:00 98 2130-02-05 03:00:00
## 28 2130-02-05 04:00:00 97 2130-02-05 04:00:00
## 29 2130-02-05 05:00:00 98 2130-02-05 05:00:00
## 30 2130-02-05 06:07:00 97 2130-02-05 06:07:00
## 31 2130-02-05 07:00:00 99 2130-02-05 07:00:00
## 32 2130-02-05 08:00:00 96 2130-02-05 08:00:00
## 33 2130-02-05 09:31:00 98 2130-02-05 09:31:00
## 34 2130-02-05 10:00:00 93 2130-02-05 10:00:00
## 35 2130-02-05 11:00:00 98 2130-02-05 11:00:00
## 36 2130-02-05 12:00:00 98 2130-02-05 12:00:00
## 37 2130-02-05 13:00:00 100 2130-02-05 13:00:00
## 38 2130-02-05 14:00:00 100 2130-02-05 14:00:00
## 39 2130-02-05 15:00:00 100 2130-02-05 15:00:00
## 40 2130-02-05 16:00:00 98 2130-02-05 16:00:00
## 41 2130-02-05 17:44:00 95 2130-02-05 17:44:00
## 42 2130-02-05 18:00:00 97 2130-02-05 18:00:00
## 43 2130-02-05 19:00:00 97 2130-02-05 19:00:00
## 44 2130-02-05 20:00:00 97 2130-02-05 20:00:00
## 45 2130-02-05 21:00:00 98 2130-02-05 21:00:00
## 46 2130-02-05 22:00:00 98 2130-02-05 22:00:00
## 47 2130-02-05 23:36:00 100 2130-02-05 23:36:00
## 48 2130-02-06 00:00:00 100 2130-02-06 00:00:00
## 49 2130-02-06 01:00:00 100 2130-02-06 01:00:00
## 50 2130-02-06 02:00:00 100 2130-02-06 02:00:00
## 51 2130-02-06 03:00:00 97 2130-02-06 03:00:00
## 52 2130-02-06 04:00:00 97 2130-02-06 04:00:00
## 53 2130-02-06 05:00:00 98 2130-02-06 05:00:00
## 54 2130-02-06 06:00:00 100 2130-02-06 06:00:00
## 55 2130-02-06 07:00:00 100 2130-02-06 07:00:00
## 56 2130-02-06 08:00:00 99 2130-02-06 08:00:00
## 57 2130-02-06 09:00:00 100 2130-02-06 09:00:00
## 58 2130-02-06 10:00:00 100 2130-02-06 10:00:00
## 59 2130-02-06 11:01:00 99 2130-02-06 11:01:00
Now let’s actually plot this
ggplot(data = df, aes(x = DATET, y = SAT)) +
geom_point() + geom_line() +
labs(x = "Date",
y = "O2 Sat",
title = "Oxygen Saturation")+
theme_minimal()+
theme(axis.text.x = element_text(angle = 90, hjust = 1))
res <- client$qraphQL('{ObservationList(code: "2708-6",
subject: "Patient/30831",
date: "lt2130-08-01")
{date : effectiveDateTime
valueQuantity @flatten { value } }}');
df <- res$data$ObservationList
df$DATET <- as.POSIXct(fixDateTime2(df$date),
tz=Sys.timezone())
df
## date value DATET
## 1 2130-02-06T11:01:00 99 2130-02-06 11:01:00
## 2 2130-02-06T10:00:00 100 2130-02-06 10:00:00
## 3 2130-02-06T09:00:00 100 2130-02-06 09:00:00
## 4 2130-02-06T08:00:00 99 2130-02-06 08:00:00
## 5 2130-02-06T07:00:00 100 2130-02-06 07:00:00
## 6 2130-02-06T06:00:00 100 2130-02-06 06:00:00
## 7 2130-02-06T05:00:00 98 2130-02-06 05:00:00
## 8 2130-02-06T04:00:00 97 2130-02-06 04:00:00
## 9 2130-02-06T03:00:00 97 2130-02-06 03:00:00
## 10 2130-02-06T02:00:00 100 2130-02-06 02:00:00
## 11 2130-02-06T01:00:00 100 2130-02-06 01:00:00
## 12 2130-02-06 100 2130-02-06 00:00:00
## 13 2130-02-05T23:36:00 100 2130-02-05 23:36:00
## 14 2130-02-05T22:00:00 98 2130-02-05 22:00:00
## 15 2130-02-05T21:00:00 98 2130-02-05 21:00:00
## 16 2130-02-05T20:00:00 97 2130-02-05 20:00:00
## 17 2130-02-05T19:00:00 97 2130-02-05 19:00:00
## 18 2130-02-05T18:00:00 97 2130-02-05 18:00:00
## 19 2130-02-05T17:44:00 95 2130-02-05 17:44:00
## 20 2130-02-05T16:00:00 98 2130-02-05 16:00:00
## 21 2130-02-05T15:00:00 100 2130-02-05 15:00:00
## 22 2130-02-05T14:00:00 100 2130-02-05 14:00:00
## 23 2130-02-05T13:00:00 100 2130-02-05 13:00:00
## 24 2130-02-05T12:00:00 98 2130-02-05 12:00:00
## 25 2130-02-05T11:00:00 98 2130-02-05 11:00:00
## 26 2130-02-05T10:00:00 93 2130-02-05 10:00:00
## 27 2130-02-05T09:31:00 98 2130-02-05 09:31:00
## 28 2130-02-05T08:00:00 96 2130-02-05 08:00:00
## 29 2130-02-05T07:00:00 99 2130-02-05 07:00:00
## 30 2130-02-05T06:07:00 97 2130-02-05 06:07:00
## 31 2130-02-05T05:00:00 98 2130-02-05 05:00:00
## 32 2130-02-05T04:00:00 97 2130-02-05 04:00:00
## 33 2130-02-05T03:00:00 98 2130-02-05 03:00:00
## 34 2130-02-05T02:00:00 99 2130-02-05 02:00:00
## 35 2130-02-05T01:00:00 93 2130-02-05 01:00:00
## 36 2130-02-05 93 2130-02-05 00:00:00
## 37 2130-02-04T23:00:00 91 2130-02-04 23:00:00
## 38 2130-02-04T22:00:00 91 2130-02-04 22:00:00
## 39 2130-02-04T21:00:00 93 2130-02-04 21:00:00
## 40 2130-02-04T20:00:00 92 2130-02-04 20:00:00
## 41 2130-02-04T19:00:00 98 2130-02-04 19:00:00
## 42 2130-02-04T18:00:00 98 2130-02-04 18:00:00
## 43 2130-02-04T17:34:00 99 2130-02-04 17:34:00
## 44 2130-02-04T16:00:00 100 2130-02-04 16:00:00
## 45 2130-02-04T15:00:00 99 2130-02-04 15:00:00
## 46 2130-02-04T14:00:00 100 2130-02-04 14:00:00
## 47 2130-02-04T13:03:00 95 2130-02-04 13:03:00
## 48 2130-02-04T12:00:00 100 2130-02-04 12:00:00
## 49 2130-02-04T11:00:00 98 2130-02-04 11:00:00
## 50 2130-02-04T10:50:00 98 2130-02-04 10:50:00
## 51 2130-02-04T10:00:00 100 2130-02-04 10:00:00
## 52 2130-02-04T09:52:00 96 2130-02-04 09:52:00
## 53 2130-02-04T09:00:00 100 2130-02-04 09:00:00
## 54 2130-02-04T08:17:00 85 2130-02-04 08:17:00
## 55 2130-02-04T08:00:00 98 2130-02-04 08:00:00
## 56 2130-02-04T07:14:00 100 2130-02-04 07:14:00
## 57 2130-02-04T06:00:00 100 2130-02-04 06:00:00
## 58 2130-02-04T05:03:00 99 2130-02-04 05:03:00
## 59 2130-02-04T04:42:00 100 2130-02-04 04:42:00
Plotting
ggplot(data = df, aes(x = DATET, y = value)) +
geom_point() + geom_line() +
labs(x = "Date",
y = "O2 Sat",
title = "Oxygen Saturation")+
theme_minimal()+
theme(axis.text.x = element_text(angle = 90, hjust = 1))
see [https://graphql.org]
session_info()
## - Session info ----------------------------------------------------------
## setting value
## version R version 3.6.1 (2019-07-05)
## os Windows 10 x64
## system x86_64, mingw32
## ui RTerm
## language (EN)
## collate English_United States.1252
## ctype English_United States.1252
## tz America/New_York
## date 2019-11-25
##
## - Packages --------------------------------------------------------------
## package * version date lib source
## assertthat 0.2.1 2019-03-21 [1] CRAN (R 3.6.1)
## backports 1.1.4 2019-04-10 [1] CRAN (R 3.6.0)
## broom 0.5.2 2019-04-07 [1] CRAN (R 3.6.1)
## callr 3.3.2 2019-09-22 [1] CRAN (R 3.6.1)
## cellranger 1.1.0 2016-07-27 [1] CRAN (R 3.6.1)
## cli 1.1.0 2019-03-19 [1] CRAN (R 3.6.1)
## colorspace 1.4-1 2019-03-18 [1] CRAN (R 3.6.1)
## crayon 1.3.4 2017-09-16 [1] CRAN (R 3.6.1)
## crosstalk 1.0.0 2016-12-21 [1] CRAN (R 3.6.1)
## curl 4.2 2019-09-24 [1] CRAN (R 3.6.1)
## desc 1.2.0 2018-05-01 [1] CRAN (R 3.6.1)
## devtools * 2.2.1 2019-09-24 [1] CRAN (R 3.6.1)
## digest 0.6.21 2019-09-20 [1] CRAN (R 3.6.1)
## dplyr * 0.8.3 2019-07-04 [1] CRAN (R 3.6.1)
## DT * 0.9 2019-09-17 [1] CRAN (R 3.6.1)
## ellipsis 0.3.0 2019-09-20 [1] CRAN (R 3.6.1)
## evaluate 0.14 2019-05-28 [1] CRAN (R 3.6.1)
## forcats * 0.4.0 2019-02-17 [1] CRAN (R 3.6.1)
## fs 1.3.1 2019-05-06 [1] CRAN (R 3.6.1)
## generics 0.0.2 2018-11-29 [1] CRAN (R 3.6.1)
## ggplot2 * 3.2.0 2019-06-16 [1] CRAN (R 3.6.0)
## glue 1.3.1 2019-03-12 [1] CRAN (R 3.6.1)
## gtable 0.3.0 2019-03-25 [1] CRAN (R 3.6.1)
## haven 2.1.1 2019-07-04 [1] CRAN (R 3.6.1)
## hms 0.5.1 2019-08-23 [1] CRAN (R 3.6.1)
## htmltools 0.3.6 2017-04-28 [1] CRAN (R 3.6.1)
## htmlwidgets 1.3 2018-09-30 [1] CRAN (R 3.6.1)
## httpuv * 1.5.2 2019-09-11 [1] CRAN (R 3.6.1)
## httr 1.4.1 2019-08-05 [1] CRAN (R 3.6.1)
## jsonlite 1.6 2018-12-07 [1] CRAN (R 3.6.1)
## knitr 1.25 2019-09-18 [1] CRAN (R 3.6.1)
## labeling 0.3 2014-08-23 [1] CRAN (R 3.6.0)
## later 0.8.0 2019-02-11 [1] CRAN (R 3.6.1)
## lattice 0.20-38 2018-11-04 [1] CRAN (R 3.6.1)
## lazyeval 0.2.2 2019-03-15 [1] CRAN (R 3.6.1)
## lubridate 1.7.4 2018-04-11 [1] CRAN (R 3.6.1)
## magrittr * 1.5 2014-11-22 [1] CRAN (R 3.6.1)
## memoise 1.1.0 2017-04-21 [1] CRAN (R 3.6.1)
## mime 0.7 2019-06-11 [1] CRAN (R 3.6.0)
## modelr 0.1.5 2019-08-08 [1] CRAN (R 3.6.1)
## munsell 0.5.0 2018-06-12 [1] CRAN (R 3.6.1)
## nlme 3.1-140 2019-05-12 [1] CRAN (R 3.6.1)
## pillar 1.4.2 2019-06-29 [1] CRAN (R 3.6.1)
## pkgbuild 1.0.5 2019-08-26 [1] CRAN (R 3.6.1)
## pkgconfig 2.0.3 2019-09-22 [1] CRAN (R 3.6.1)
## pkgload 1.0.2 2018-10-29 [1] CRAN (R 3.6.1)
## prettyunits 1.0.2 2015-07-13 [1] CRAN (R 3.6.1)
## processx 3.4.1 2019-07-18 [1] CRAN (R 3.6.1)
## promises 1.0.1 2018-04-13 [1] CRAN (R 3.6.1)
## ps 1.3.0 2018-12-21 [1] CRAN (R 3.6.1)
## purrr * 0.3.2 2019-03-15 [1] CRAN (R 3.6.1)
## R6 2.4.1 2019-11-12 [1] CRAN (R 3.6.1)
## Rcpp 1.0.2 2019-07-25 [1] CRAN (R 3.6.1)
## readr * 1.3.1 2018-12-21 [1] CRAN (R 3.6.1)
## readxl 1.3.1 2019-03-13 [1] CRAN (R 3.6.1)
## remotes 2.1.0 2019-06-24 [1] CRAN (R 3.6.1)
## rlang 0.4.0 2019-06-25 [1] CRAN (R 3.6.1)
## rmarkdown 1.15 2019-08-21 [1] CRAN (R 3.6.1)
## RonFHIR * 0.3.0 2019-11-25 [1] Github (FirelyTeam/RonFHIR@d086672)
## rprojroot 1.3-2 2018-01-03 [1] CRAN (R 3.6.1)
## rstudioapi 0.10 2019-03-19 [1] CRAN (R 3.6.1)
## rvest 0.3.4 2019-05-15 [1] CRAN (R 3.6.1)
## scales 1.0.0 2018-08-09 [1] CRAN (R 3.6.1)
## sessioninfo 1.1.1 2018-11-05 [1] CRAN (R 3.6.1)
## shiny 1.3.2 2019-04-22 [1] CRAN (R 3.6.1)
## stringi 1.4.3 2019-03-12 [1] CRAN (R 3.6.0)
## stringr * 1.4.0 2019-02-10 [1] CRAN (R 3.6.1)
## testthat 2.2.1 2019-07-25 [1] CRAN (R 3.6.1)
## tibble * 2.1.3 2019-06-06 [1] CRAN (R 3.6.1)
## tidyr * 0.8.3 2019-03-01 [1] CRAN (R 3.6.1)
## tidyselect 0.2.5 2018-10-11 [1] CRAN (R 3.6.1)
## tidyverse * 1.2.1 2017-11-14 [1] CRAN (R 3.6.1)
## usethis * 1.5.1 2019-07-04 [1] CRAN (R 3.6.1)
## vctrs 0.2.0 2019-07-05 [1] CRAN (R 3.6.1)
## withr 2.1.2 2018-03-15 [1] CRAN (R 3.6.1)
## xfun 0.9 2019-08-21 [1] CRAN (R 3.6.1)
## xml2 1.2.2 2019-08-09 [1] CRAN (R 3.6.1)
## xtable 1.8-4 2019-04-21 [1] CRAN (R 3.6.1)
## yaml 2.2.0 2018-07-25 [1] CRAN (R 3.6.0)
## zeallot 0.1.0 2018-01-28 [1] CRAN (R 3.6.1)
##
## [1] C:/Users/huserv/R/R-3.6.1/library