### checker if NHS number is valid nhs_number_validation <- function(nhs_number = NULL){ require(stringr) # for string manipulation ### remove spaces in number nhs_number <- as.character(nhs_number) # conver to character if a number nhs_number <- str_replace_all(nhs_number, " ", "") # remove whitespace with stringr ### check the length of the number; should be 10 stopifnot(nchar(nhs_number) ==10) # print(nhs_number) ### create a dataframe that splits into separate numbers df <- data.frame("id" = nhs_number) df$id <- as.numeric(nhs_number) df <- cbind(df, "id" = outer(df$id, 10^c(9:0), function (x , y) x %/% y %% 10 )) ### copy the first row to the second df[2,] <- df[1,] ### multiply digits 1:9 by 10:2 multiplier <- c(10, 9, 8, 7, 6, 5, 4, 3, 2) df[2,2:10] <- df[2,2:10] * multiplier # print(df) checker <- sum(df[2, 2:10]) # print(checker) integer_part <- checker %/% 11 remainder <- checker %% 11 check_digit <- ifelse((11 - remainder) == 11, 0, ifelse((11 - remainder) == 10, NA, (11 - remainder))) last_number <- df[1,11] # print(c('interger part', integer_part)) # print(c("remainder", remainder)) # print(c("last number", last_number)) # print(c("check digit", check_digit)) result <- ifelse(check_digit != last_number | is.na(check_digit), "Invalid", "Valid") # print(c("result", result)) return(result) }