################################################################################
#
#' Calculate sanitation indicators
#'
#' @param surveyData A data frame containing information for calculating
#' sanitation indicators
#' @return A data frame containing calculated sanitation indicators
#' @examples
#' # Apply function to surveyDataBGD
#' sanDF <- get_sanitation_vars(washdata::surveyDataBGD)
#' sanDF
#'
#' @export
#'
#
################################################################################
get_sanitation_vars <- function(surveyData) {
## san1: shared sanitation facility - user arrangements
## Re-code
san1 <- ifelse(surveyData$san1 == "", "Don't know",
ifelse(surveyData$san1 == "Other (please specify)",
surveyData$san2, surveyData$san1))
## Clean-up
san1 <- ifelse(san1 == "Communal / shared toilet ", "Communal / shared toilet", san1)
## san1a: is toilet facility shared with other households
san1a <- ifelse(san1 == "Household toilet", 0, 1)
## san2: Mean number of people who share toilet facilities
san2 <- ifelse(is.na(surveyData$san4), 0, surveyData$san4)
## san2a: shared toilet facility
san2a <- ifelse(san2 == 0, 0, 1)
## san3: type of facility
san3 <- ifelse(surveyData$san6 == "Other (please specify)",
surveyData$san7,
surveyData$san6)
## clean-up
san3 <- ifelse(san3 %in% c("Drain", "Drain connected with waterbody",
"Drain with water body (Jhill)", "Open drain"), "Drain",
ifelse(san3 %in% c("In water body (Jhill)", "Water body (Lake)", "Lake", "Pond",
"No facilities or bush or field"),
"No facilities or bush or field or lake or pond",
ifelse(san3 %in% c("Ditch with ring", "Ring and slub",
"Slub and in the bottom drain"),
"Ring and slab without pit latrine", san3)))
## san4: where effluent flushes to
san4 <- ifelse(surveyData$san9 == "", "Don't know",
ifelse(surveyData$san9 == "Other (please specify)",
surveyData$san10,
surveyData$san9))
## clean-up
san4 <- ifelse(san4 %in% c("Open drain",
"Adjacent to pond",
"Ditch",
"Ditch ",
"pond",
"River",
"Water body (Cannel)"), "Open drain/ditch/water body",
ifelse(san4 == "Tanki", "Septic tank", san4))
## san5: WSUP-supported facility
san5 <- ifelse(surveyData$san12 == "" & surveyData$san13 == "TRUE", "Not applicable",
ifelse(surveyData$san12 == "" & surveyData$san14 == "TRUE",
"Don't know",
surveyData$san12))
## re-code
san5 <- ifelse(san5 == "Yes", 1,
ifelse(san5 == "No", 0, NA))
## san6: water in facility (Yes / No)
san6 <- ifelse(surveyData$san15 == "Yes", 1, 0)
## san7: satisfied with handwashing facility
san7 <- ifelse(surveyData$san17 == "Yes", 1, 0)
## san8: what would increase your satisfaction
sanSatisfaction <- ifelse(surveyData$san19 == "Other (please specify)",
surveyData$san20,
surveyData$san19)
sanSatisfaction <- ifelse(sanSatisfaction == "",
NA,
sanSatisfaction)
sanSatisfaction <- str_split(string = sanSatisfaction, pattern = ", ", simplify = TRUE)
## Cycle through columns of sanSatisfaction
for(i in 1:ncol(sanSatisfaction)) {
sanSatisfaction[ , i] <- ifelse(sanSatisfaction[ , i] == "Other (please specify)",
surveyData$san20,
sanSatisfaction[ , i])
sanSatisfaction[ , i] <- ifelse(sanSatisfaction[ , i] == "",
NA,
sanSatisfaction[ , i])
}
## Create temporary container for vector outputs
temp <- NULL
## Cycle through columns of sanSatisfaction
for(i in 1:ncol(sanSatisfaction)) {
## Concatenate sanSatisfaction columns into a single vector
temp <- c(temp, sanSatisfaction[ , i])
}
## Re-assign NA value to "" answers
temp <- ifelse(temp == "", NA, temp)
## Get responses
tempNames <- names(table(temp))
## Vector accumulator
san8 <- NULL
## Cycle through responses
for(i in 1:length(tempNames)) {
## Create empty vector with length of surveyData
assign(paste("san8", letters[i], sep = ""),
vector(mode = "numeric", length = nrow(surveyData)))
## Cycle through data columns in waterCollect
for(j in 1:ncol(sanSatisfaction)) {
## Assign values
x <- ifelse(sanSatisfaction[ , j] == tempNames[i], i, 0)
## Concatenate responses
assign(paste("san8", letters[i], sep = ""),
get(paste("san8", letters[i], sep = "")) + x)
}
## Rename responses to character strings
assign(paste("san8", letters[i], sep = ""),
ifelse(get(paste("san8", letters[i], sep = "")) == i, tempNames[i], NA))
## Concatenate into data.frame
san8 <- data.frame(cbind(san8, get(paste("san8", letters[i], sep = ""))))
}
## Rename the data.frame
names(san8) <- paste("san8", letters[1:length(tempNames)], sep = "")
## san9: lights in toilet facility
san9 <- ifelse(surveyData$san22 == "Yes", 1, 0)
## san10: lockable door
san10 <- ifelse(surveyData$san24 == "Yes", 1, 0)
## san11: container for menstrual hygiene management
san11 <- ifelse(surveyData$san26 == "Yes", 1, 0)
## san12: sanitary disposal of child's faeces
san12 <- ifelse(surveyData$san28 %in% c("Child used toilet/latrine",
"Put/rinsed into the toilet"), 1, 0)
## san13: Waiting time to use the toilet
san13 <- ifelse(is.na(surveyData$san31), 0, surveyData$san31)
## san13a: adequate physical access to sanitation facility
san13a <- ifelse(san13 < 30, 1, 0)
## san14: spend on sanitation facility
san14 <- ifelse(is.na(surveyData$san33), 0, surveyData$san33)
## san15: satisfied with spend
san15 <- ifelse(surveyData$san36 == "", NA,
ifelse(surveyData$san36 == "Yes", 1, 0))
## san16: initial investment in toilet facility
san16 <- ifelse(surveyData$san38 == "Yes", 1, 0)
## san17: amount of investment
san17 <- ifelse(is.na(surveyData$san40), 0, surveyData$san40)
## san18: willingness to invest
san18 <- ifelse(surveyData$san43 == "Yes", 1, 0)
## san19: satisfied with cleanliness
san19 <- ifelse(surveyData$san46 == "Yes", 1,
ifelse(surveyData$san46 == "No", 0, NA))
## Re-code
cleanSatisfaction <- ifelse(surveyData$san48 == "Other (please specify)",
surveyData$san49,
surveyData$san48)
cleanSatisfaction <- ifelse(cleanSatisfaction == "",
NA,
cleanSatisfaction)
cleanSatisfaction <- str_split(string = cleanSatisfaction, pattern = ", ", simplify = TRUE)
## Create temporary container for vector outputs
temp <- NULL
## Cycle through columns of cleanSatisfaction
for(i in 1:ncol(cleanSatisfaction)) {
## Re-code
cleanSatisfaction[ , i] <- ifelse(cleanSatisfaction[ , i] == "Other (please specify)",
surveyData$san20, cleanSatisfaction[ , i])
cleanSatisfaction[ , i] <- ifelse(cleanSatisfaction[ , i] == "",
NA, cleanSatisfaction[ , i])
}
## Create temporary container for vector outputs
temp <- NULL
## Cycle through columns of cleanSatisfaction
for(i in 1:ncol(cleanSatisfaction)) {
## Concatenate cleanSatisfaction columns into a single vector
temp <- c(temp, cleanSatisfaction[ , i])
}
## Re-assign NA value to "" answers
temp <- ifelse(temp == "", NA, temp)
## Get responses
tempNames <- names(table(temp))
## Empty container
san20 <- NULL
## Cycle through responses
for(i in 1:length(tempNames)) {
## Create empty vector with length of surveyData
assign(paste("san20", letters[i], sep = ""),
vector(mode = "numeric", length = nrow(surveyData)))
## Cycle through data columns in cleanSatisfaction
for(j in 1:ncol(cleanSatisfaction)) {
## Assign values
x <- ifelse(cleanSatisfaction[ , j] == tempNames[i], i, 0)
## Concatenate responses
assign(paste("san20", letters[i], sep = ""),
get(paste("san20", letters[i], sep = "")) + x)
}
## Rename responses to character strings
assign(paste("san20", letters[i], sep = ""),
ifelse(get(paste("san20", letters[i], sep = "")) == i, tempNames[i], NA))
## Concatenate into data.frame
san20 <- data.frame(cbind(san20, get(paste("san20", letters[i], sep = ""))))
}
## Rename the data.frame
names(san20) <- paste("san20", letters[1:length(tempNames)], sep = "")
## san21: everyone in household able to get to sanitation facility
san21 <- ifelse(surveyData$san51 == "Yes", 1, 0)
## san22: who is not using the sanitation facility?
sanitationUse <- ifelse(surveyData$san53 == "", NA,
ifelse(surveyData$san53 == "Other (please specify)",
surveyData$san54,
surveyData$san53))
sanitationUse <- str_split(string = sanitationUse, pattern = ", ", simplify = TRUE)
## Create temporary container for vector outputs
temp <- NULL
## Cycle through columns of sanitationUse
for(i in 1:ncol(sanitationUse)) {
sanitationUse[ , i] <- ifelse(sanitationUse[ , i] == "Other (please specify)",
surveyData$san20, sanitationUse[ , i])
sanitationUse[ , i] <- ifelse(sanitationUse[ , i] == "",
NA, sanitationUse[ , i])
}
## Create temporary container for vector outputs
temp <- NULL
## Cycle through columns of sanitationUse
for(i in 1:ncol(sanitationUse)) {
## Concatenate sanitationUse columns into a single vector
temp <- c(temp, sanitationUse[ , i])
}
## Re-assign NA value to "" answers
temp <- ifelse(temp == "", NA, temp)
## Get responses
tempNames <- names(table(temp))
## Vector accumulator
san22 <- NULL
## Cycle through responses
for(i in 1:length(tempNames)) {
## Create empty vector with length of surveyData
assign(paste("san22", letters[i], sep = ""),
vector(mode = "numeric", length = nrow(surveyData)))
## Cycle through data columns in waterCollect
for(j in 1:ncol(sanitationUse)) {
## Assign values
x <- ifelse(sanitationUse[ , j] == tempNames[i], i, 0)
## Concatenate responses
assign(paste("san22", letters[i], sep = ""),
get(paste("san22", letters[i], sep = "")) + x)
}
## Rename responses to character strings
assign(paste("san22", letters[i], sep = ""),
ifelse(get(paste("san22", letters[i], sep = "")) == i, tempNames[i], NA))
## Concatenate into data.frame
san22 <- data.frame(cbind(san22, get(paste("san22", letters[i], sep = ""))))
}
## Rename the data.frame
names(san22) <- paste("san22", letters[1:length(tempNames)], sep = "")
## san23: do all household members usually use the available sanitation facilities
san23 <- ifelse(surveyData$san59 == "", "Don't know", surveyData$san59)
san23 <- ifelse(san23 == "Yes", 1,
ifelse(san23 == "No", 0, NA))
## san24: who is not using sanitation facilities
sanitationUsage <- ifelse(surveyData$san61 == "", NA,
ifelse(surveyData$san61 == "Other (please specify)",
surveyData$san62, surveyData$san61))
sanitationUsage <- str_split(string = sanitationUsage, pattern = ", ", simplify = TRUE)
## Create temporary container for vector outputs
temp <- NULL
## Cycle through columns of sanitationUsage
for(i in 1:ncol(sanitationUsage)) {
## Assign values
sanitationUsage[ , i] <- ifelse(sanitationUsage[ , i] == "Other (please specify)",
surveyData$san62,
sanitationUsage[ , i])
sanitationUsage[ , i] <- ifelse(sanitationUsage[ , i] == "",
NA,
sanitationUsage[ , i])
}
## Create temporary container for vector outputs
temp <- NULL
## Cycle through columns of sanitationUsage
for(i in 1:ncol(sanitationUsage)) {
## Concatenate sanitationUsage columns into a single vector
temp <- c(temp, sanitationUsage[ , i])
}
## Re-assign NA value to "" answers
temp <- ifelse(temp == "", NA, temp)
## Get responses
tempNames <- names(table(temp))
## Vector accumulator
san24 <- NULL
## Cycle through responses
for(i in 1:length(tempNames)) {
## Create empty vector with length of surveyData
assign(paste("san24", letters[i], sep = ""),
vector(mode = "numeric", length = nrow(surveyData)))
## Cycle through data columns in waterCollect
for(j in 1:ncol(sanitationUsage)) {
## Assign values
x <- ifelse(sanitationUsage[ , j] == tempNames[i], i, 0)
## Concatenate responses
assign(paste("san24", letters[i], sep = ""),
get(paste("san24", letters[i], sep = "")) + x)
}
## Rename responses to character strings
assign(paste("san24", letters[i], sep = ""),
ifelse(get(paste("san24", letters[i], sep = "")) == i, tempNames[i], NA))
## Concatenate data.frame
san24 <- data.frame(cbind(san24, get(paste("san24", letters[i], sep = ""))))
}
## Rename the data.frame
names(san24) <- paste("san24", letters[1:length(tempNames)], sep = "")
## san25: problem with sanitation facility
san25 <- ifelse(surveyData$san66 == "", "Don't know",
ifelse(surveyData$san66 == "Other (please specify)",
surveyData$san67,
surveyData$san66))
san25 <- ifelse(san25 == "", "Don't know", san25)
## Clean-up
san25 <- ifelse(san25 %in% c("Call sweeper by own intiative ",
"Do work by calling sweeper"),
"Call sweeper by own intiative",
ifelse(san25 == "Manager ", "Manager",
ifelse(san25 == "Quarter inside university, so the relevant person of university",
"Responsible university staff",
san25)))
## Re-code: formal service maintainer
san25 <- ifelse(san25 %in% c("Facility operator",
"Quarter inside university, so the relevent person of university",
"Water and Sanitation Authority (WASHA)"), 1, 0)
## san31: when should you wash hands?
washEvents <- ifelse(surveyData$san85 == "", "Don't know",
ifelse(surveyData$san85 == "Other (please specify)",
surveyData$san86,
surveyData$san85))
washEvents <- str_split(string = washEvents, pattern = ", ", simplify = TRUE)
## Create temporary container for vector outputs
temp <- NULL
## Cycle through columns of washEvents
#
for(i in 1:ncol(washEvents)) {
## Assign values
washEvents[ , i] <- ifelse(washEvents[ , i] == "Other (please specify)",
surveyData$san86,
washEvents[ , i])
}
## Create temporary container for vector outputs
temp <- NULL
## Cycle through columns of washEvents
for(i in 1:ncol(washEvents)) {
## Concatenate washEvents columns into a single vector
temp <- c(temp, washEvents[ , i])
}
## Re-assign NA value to "" answers
temp <- ifelse(temp == "", NA, temp)
## Get responses
tempNames <- names(table(temp))
## Vector accumulator
san31 <- NULL
## Cycle through responses
for(i in 1:length(tempNames)) {
## Create empty vector with length of surveyData
assign(paste("san31", letters[i], sep = ""),
vector(mode = "numeric", length = nrow(surveyData)))
## Cycle through data columns in waterCollect
for(j in 1:ncol(washEvents)) {
## Assign values
x <- ifelse(washEvents[ , j] == tempNames[i], i, 0)
## Concatenate responses
assign(paste("san31", letters[i], sep = ""),
get(paste("san31", letters[i], sep = "")) + x)
}
## Rename responses to character strings
assign(paste("san31", letters[i], sep = ""),
ifelse(get(paste("san31", letters[i], sep = "")) == i, tempNames[i], NA))
## Concatenate into data.frame
san31 <- data.frame(cbind(san31, get(paste("san31", letters[i], sep = ""))))
}
## Rename the data.frame
names(san31) <- paste("san31", letters[1:length(tempNames)], sep = "")
## san32: households with handwashing facility with soap and water at sanitation facility
san32 <- ifelse(surveyData$san88 == "Handwashing station with clean water and soap available", 1, 0)
## san33: how often is septic tank emptied
san33 <- ifelse(surveyData$san90 == "Other (please specify)", surveyData$san91,
ifelse(surveyData$san90 == "" & surveyData$san92 == TRUE, NA,
ifelse(surveyData$san90 == "" & surveyData$san93 == TRUE, "Don't know", surveyData$san90)))
## clean-up
san33 <- ifelse(!san4 %in% c("Pit latrine", "Septic tank"), NA,
ifelse(san33 %in% c("new house", "Did not empty till now"), "Don't know",
ifelse(san33 %in% c("Stool go to pond",
"Stool go to the cannal"), NA,
san33)))
## san34: cost of empyting tank
san34 <- ifelse(surveyData$san94 == "", NA, surveyData$san94)
## san35: who empties pit
san35 <- ifelse(surveyData$san98 == "", "Don't know/not applicable",
ifelse(surveyData$san98 == "Other (please specify)",
surveyData$san99,
surveyData$san98))
## Clean-up
san35a <- ifelse(san35 == "House owner ", "House owner",
ifelse(san35 == "Sweeper ", "Sweeper",
ifelse(san35 == "By own", "Family member or informal manual emptier", san35)))
## Re-code
san35 <- ifelse(san35a %in% c("Formal larger business",
"Formal small business using manual or automated tool",
"Water and Sanitation Authority (WASHA)"), 1, 0)
## san36: who pays for pit to be emptied
san36 <- ifelse(surveyData$san102 == "", "Don't know/not applicable",
ifelse(surveyData$san102 == "Other (please specify)",
surveyData$san103,
surveyData$san102))
## Clean-up
san36 <- ifelse(san36 == "Water and Sanitation Authority (WASHA)",
"Water and Sanitation Authority (WASHA)",
ifelse(san36 == "City corporation ",
"City corporation",
ifelse(san36 == "Owner of house ",
"Owner of house", san36)))
## Re-code san34 to take into account who pays for pit emptying
san34a <- ifelse(san36 != "My household", NA, san34)
## san37: satisfaction with pit emptying service
san37 <- ifelse(surveyData$san106 == "", NA,
ifelse(surveyData$san106 == "Yes", 1, 0))
## san38: excreta disposal after emptying tank
#
## Check if excreta disposal after emtpying data avaiable
if(exists("excretaDisposalDF")) {
## Add re-code logic here using excreta disposal data to create
## object called san38
} else {
san38 <- vector(mode = "numeric", length = nrow(surveyData))
san38[san38 == 0] <- NA
}
## JMP Post-2015 sanitation indicators
## jmpSan1: open defecation
jmpSan1 <- ifelse(san3 == "No facilities or bush or field or lake or pond", 1, 0)
## jmpSan2: unimproved sanitation facilities
jmpSan2 <- ifelse(san3 %in% c("Hanging toilet/hanging latrine",
"Pit latrine without slab/open pit",
"Ring and slab without pit latrine",
"Drain"), 1, 0)
## jmpSan3: limited sanitation facility
jmpSan3 <- ifelse(san3 %in% c("Flush/pour flush",
"Pit latrine with slab or ventilated improved pit latrine (VIP)",
"Portable toilet with emptying service",
"Composting toilet") &
san4 %in% c("Piped sewer system", "Pit latrine", "Septic tank", "Don't know") &
san1a == 1, 1, 0)
## jmpSan4: at least basic
jmpSan4 <- ifelse(san3 %in% c("Flush/pour flush",
"Pit latrine with slab or ventilated improved pit latrine (VIP)",
"Portable toilet with emptying service",
"Composting toilet") &
san4 %in% c("Piped sewer system", "Pit latrine", "Septic tank", "Don't know") &
san1a == 0, 1, 0)
## jmpSan5: empty
jmpSan5 <- vector(mode = "numeric", length = nrow(surveyData))
jmpSan5[jmpSan5 == 0] <- NA
## Check if excretaDisposalDF is available
if(exists("excretaDisposalDF")) {
## jmpSan4: basic sanitation facility
jmpSan4 <- vector(mode = "numeric", length = nrow(surveyData))
## Basic sanitation services - pit latrine system
jmpSan4[san3 %in% c("Pit latrine with slab or ventilated improved pit latrine (VIP)",
"Composting toilet") &
san4 != "Piped sewer system" &
san1a == 0 &
san33 != "Have never emptied it before" &
!san38 %in% c("To a covered and sealed hole (buried)",
"Taken away through the sewer system to a treatment facility",
"Taken away by the service provider to a treatment facility")] <- 1
## Basic sanitation services - flush/pour flush/toilet system without piped water system
jmpSan4[san3 %in% c("Flush/pour flush",
"Portable toilet with emptying service") &
san4 != "Piped sewer system" &
san1a == 0 &
!san38 %in% c("To a covered and sealed hole (buried)",
"Taken away through the sewer system to a treatment facility",
"Taken away by the service provider to a treatment facility")] <- 1
## jmpSan5: safely managed
jmpSan5 <- vector(mode = "numeric", length = nrow(surveyData))
##
jmpSan5[san3 %in% c("Flush/pour flush",
"Portable toilet with emptying service") &
san4 == "Piped sewer system" &
san1a == 0] <- 1
##
jmpSan5[san3 %in% c("Flush/pour flush",
"Portable toilet with emptying service") &
san4 %in% c("Pit latrine",
"Septic tank",
"Don't know") &
san1a == 0 &
san38 %in% c("To a covered and sealed hole (buried)",
"Taken away through the sewer system to a treatment facility",
"Taken away by the service provider to a treatment facility")] <- 1
##
jmpSan5[san3 %in% c("Pit latrine with slab or ventilated improved pit latrine (VIP)",
"Composting toilet") &
san4 != "Piped sewer system" &
san1a == 0 &
(san33 == "Have never emptied it before" |
san38 %in% c("To a covered and sealed hole (buried)",
"Taken away through the sewer system to a treatment facility",
"Taken away by the service provider to a treatment facility"))] <- 1
}
## Adequate sanitaiton facility
adequateSan <- ifelse(san3 %in% c("Flush/pour flush",
"Pit latrine with slab or ventilated improved pit latrine (VIP)") &
san4 != "Open drain / ditch / water body", 1, 0)
## Accessible sanitation facility
accessSan <- ifelse(san21 == 1 & san23 == 1, 1, 0)
## Acceptable sanitation facility
## Re-code for proportion indicator
acceptSan <- ifelse(adequateSan == 1 &
san6 == 1 &
san9 == 1 &
san10 == 1 &
san11 == 1, 1, 0)
## Re-code for mean indicator
acceptDF <- data.frame(adequateSan, san6, san9, san10, san11)
## Get acceptable sanitaiton score (0-5)
acceptScore <- rowSums(acceptDF, na.rm = TRUE)
## Create sanDF
## Concatenate sanitation indicators
sanDF <- data.frame("uniqueID" = surveyData[ , "uniqueID"],
san1, san1a, san2, san2a, san3, san4, san5, san6, san7, san8,
san9, san10, san11, san12, san13, san13a, san14, san15, san16,
san17, san18, san19, san20, san21, san22, san23, san24, san25,
san32, san33, san34, san34a, san35, san35a, san36, san37,
jmpSan1, jmpSan2, jmpSan3, jmpSan4, jmpSan5,
adequateSan, accessSan, acceptSan, acceptScore)
return(sanDF)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.