The function goes through steps: 1 - load the indicators, 2 - append the one from inidcatoradd if any, 3 - apply the indicator, i.e. do the calculation, 4 - re-save all the working indicator definition within the extended xlsform 5 - bind the new indicators in the dictionary in order to use the kobo_frame() function for further plotting 6 - rebuild the plan if indicators are allocated to chapter, subchapter
Usage
kobo_indicator(
datalist,
dico,
xlsformpath,
xlsformpathout,
indicatoradd = NULL,
showcode = FALSE
)
Arguments
- datalist
An object of the "datalist" class as defined in kobocruncher
- dico
An object of the "kobodico" class format as defined in kobocruncher
- xlsformpath
path to the (extended) xlsform file used to collect the data
- xlsformpathout
path to save the xlsform file with newly added indicators
- indicatoradd
a list containing all key information to add a calculated indicator within the analysis plan
- showcode
display the code
Examples
xlsformpath <- system.file("sample_xlsform.xlsx", package = "kobocruncher")
xlsformpathout <- paste0(tempdir(),"/", "sample_xlsform_withindic.xlsx")
dico <- kobo_dico( xlsformpath = system.file("sample_xlsform.xlsx", package = "kobocruncher") )
datalist <- kobo_data(datapath = system.file("data.xlsx", package = "kobocruncher") )
## Check if we add no indicator
expanded <- kobo_indicator(datalist = datalist,
dico = dico,
indicatoradd = NULL ,
xlsformpath = xlsformpath,
xlsformpathout = xlsformpathout)
#> no calculated indicators has been defined...
## Example 1: Simple dummy filter
indicatoradd <- c( name = "inColombia",
type = "select_one",
label = "Is from Colombia",
repeatvar = "main",
calculation = "dplyr::if_else(datalist[[\"main\"]]$profile.country ==
\"COL\", \"yes\",\"no\")")
expanded <- kobo_indicator(datalist = datalist,
dico = dico,
indicatoradd = indicatoradd ,
xlsformpath = xlsformpath,
xlsformpathout = xlsformpathout)
## Replace existing
dico <- expanded[["dico"]]
datalist <- expanded[["datalist"]]
## Check my new indicator
table(datalist[[1]]$inColombia, useNA = "ifany")
#>
#> no yes
#> 4 1
## Example 2: calculation on nested elements and build an indicator list
indicatoradd2 <- c( name = "hasfemalemembers",
type = "select_one",
label = "HH has female members ",
repeatvar = "main",
calculation = "datalist[[\"members\"]] |>
dplyr::select( members.sex, parent_index) |>
tidyr::gather( parent_index, members.sex) |>
dplyr::count(parent_index, members.sex) |>
tidyr::spread(members.sex, n, fill = 0) |>
dplyr::select( female)")
indicatorall <- list(indicatoradd, indicatoradd2 )
expanded <- kobo_indicator(datalist = datalist,
dico = dico,
indicatoradd = indicatorall ,
xlsformpath = xlsformpath,
xlsformpathout = xlsformpathout)
## Replace existing
dico <- expanded[["dico"]]
datalist <- expanded[["datalist"]]
## Check my new indicator
table(datalist[[1]]$hasfemalemembers, useNA = "ifany")
#> female
#> 0 1 2
#> 1 3 1
# Example of calculations:
#
# 1. Create a filters on specific criteria
# 'dplyr::if_else(datalist[["main"]]$variable =="criteria", "yes","no")'
#
#
# 2. Ratio between 2 numeric variable
# 'datalist[["main"]]$varnum1 / datalist[["main"]]$varnum2'
#
#
# 3. Calculation on date - month between data and now calculated in months
# 'lubridate::interval( datalist[["main"]]$datetocheck,
# lubridate::today()) %/% months(1)'
#
# 4. Discretization of numeric variable according to quintile
# 'Hmisc::cut2(datalist[["main"]]$varnum, g =5)'
#
# 5. Discretization of numeric variable according to fixed break -
# for instance case size from integer to categoric
# 'cut(datalist[["main"]]$casesize, breaks = c(0, 1, 2, 3,5,30),
# labels = c("Case.size.1", "Case.size.2", "Case.size.3",
# "Case.size.4.5", "Case.size.6.or.more" ), include.lowest=TRUE)'
#
# 6. Aggregate variable from nested frame (aka within repeat) to parent table
# 'datalist[["members"]] |>
# dplyr::select( members.sex, parent_index) |>
# tidyr::gather( parent_index, members.sex) |>
# dplyr::count(parent_index, members.sex) |>
# tidyr::spread(members.sex, n, fill = 0) |>
# dplyr::select( female)'