Lets just load the data first
InputDt <- read.csv("file:///D:/MR_Marata/data_notification_Q4.csv")
For clarity lets just look at the easy case first: Adding district name using the “district code”. The ideas presented can easily be generized for the case when there is need to use the “organization unit name”.
# make an ordered list of district code from the data
DistrictCodes <- sort(unique(substr(InputDt$organisationunitcode,0, 1)),decreasing = FALSE)
# simpler case:
# with missing values "" and "T" and "P" are left for this example
DistrictCodesA<- DistrictCodes[c(-1,-length(DistrictCodes),-(length(DistrictCodes)-1))]
# Here we keep the same order as in "DistrictCodes"
DistrictNameA<-c("Maseru","Botha-Bothe","Leribe","Berea","Mafeteng","Mohale's Hoek","Quthing","Qacha's Nek","Mokhotlong","Thaba-Tseka")
# much demanding case:
# easily solved through filtering with "organization unit name".
#DistrictCodesB<- DistrictCodes[c(1,length(DistrictCodes),(length(DistrictCodes)-1))]
CODE CHUNK
Here we just domonstrate how you can avoid the repeated aspects of your code with a single for loop.
getDistNameFromDistCode<-function(DistrictCodesA,DistrictNameA){
#*****************************************************************************************
# This function uses the distric code from an input dataframe to filter data chunks whose distric name can be added by simply reading the district code.
# The data chunks with district name column added are binded and returned as an ouput
#*****************************************************************************************
library("hash")
#dictionary with (CODE : DISTNAME) pair
h<-hash(DistrictCodesA,DistrictNameA)
#template dataframe for output
OutDt<-InputDt[1,]
OutDt$District<-""
OutDt<-OutDt[-1,]
for(i in DistrictCodesA){
#subset the input data by DISTR. CODE
tempDtf <-InputDt[substr(InputDt$organisationunitcode,0,1)==i,]
#add a DISTR name on a new column "District"
tempDtf$District<-h[[i]]
OutDt<-rbind(OutDt,tempDtf)
}
return(OutDt)
}
OutDTF<- getDistNameFromDistCode(DistrictCodesA,DistrictNameA)
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpMZXRzIGp1c3QgbG9hZCB0aGUgZGF0YSBmaXJzdA0KYGBge3J9DQoNCklucHV0RHQgPC0gcmVhZC5jc3YoImZpbGU6Ly8vRDovTVJfTWFyYXRhL2RhdGFfbm90aWZpY2F0aW9uX1E0LmNzdiIpDQoNCmBgYA0KRm9yIGNsYXJpdHkgbGV0cyBqdXN0IGxvb2sgYXQgdGhlIGVhc3kgY2FzZSBmaXJzdDogQWRkaW5nIGRpc3RyaWN0IG5hbWUgdXNpbmcgdGhlICJkaXN0cmljdCBjb2RlIi4gVGhlIGlkZWFzIHByZXNlbnRlZCBjYW4gZWFzaWx5IGJlIGdlbmVyaXplZCBmb3IgdGhlIGNhc2Ugd2hlbiB0aGVyZSBpcyBuZWVkIHRvIHVzZSANCnRoZSAib3JnYW5pemF0aW9uIHVuaXQgbmFtZSIuDQoNCmBgYHtyfQ0KDQojIG1ha2UgYW4gb3JkZXJlZCBsaXN0IG9mIGRpc3RyaWN0IGNvZGUgZnJvbSB0aGUgZGF0YQ0KRGlzdHJpY3RDb2RlcyA8LSBzb3J0KHVuaXF1ZShzdWJzdHIoSW5wdXREdCRvcmdhbmlzYXRpb251bml0Y29kZSwwLCAxKSksZGVjcmVhc2luZyA9IEZBTFNFKQ0KDQojIHNpbXBsZXIgY2FzZTogDQoNCiMgd2l0aCBtaXNzaW5nIHZhbHVlcyAiIiBhbmQgIlQiIGFuZCAiUCIgYXJlIGxlZnQgZm9yIHRoaXMgZXhhbXBsZQ0KRGlzdHJpY3RDb2Rlc0E8LSBEaXN0cmljdENvZGVzW2MoLTEsLWxlbmd0aChEaXN0cmljdENvZGVzKSwtKGxlbmd0aChEaXN0cmljdENvZGVzKS0xKSldDQoNCiMgSGVyZSB3ZSBrZWVwIHRoZSBzYW1lIG9yZGVyIGFzIGluICJEaXN0cmljdENvZGVzIg0KRGlzdHJpY3ROYW1lQTwtYygiTWFzZXJ1IiwiQm90aGEtQm90aGUiLCJMZXJpYmUiLCJCZXJlYSIsIk1hZmV0ZW5nIiwiTW9oYWxlJ3MgSG9layIsIlF1dGhpbmciLCJRYWNoYSdzIE5layIsIk1va2hvdGxvbmciLCJUaGFiYS1Uc2VrYSIpDQoNCiMgbXVjaCBkZW1hbmRpbmcgY2FzZToNCiMgZWFzaWx5IHNvbHZlZCAgdGhyb3VnaCBmaWx0ZXJpbmcgd2l0aCAib3JnYW5pemF0aW9uIHVuaXQgbmFtZSIuDQojRGlzdHJpY3RDb2Rlc0I8LSBEaXN0cmljdENvZGVzW2MoMSxsZW5ndGgoRGlzdHJpY3RDb2RlcyksKGxlbmd0aChEaXN0cmljdENvZGVzKS0xKSldDQoNCmBgYA0KDQpDT0RFIENIVU5LDQo9PT09PT09PT09DQoNCkhlcmUgd2UganVzdCBkb21vbnN0cmF0ZSBob3cgeW91IGNhbiBhdm9pZCB0aGUgcmVwZWF0ZWQgYXNwZWN0cyBvZiB5b3VyIGNvZGUgd2l0aCBhIHNpbmdsZSANCmZvciBsb29wLg0KDQpgYGB7cn0NCg0KZ2V0RGlzdE5hbWVGcm9tRGlzdENvZGU8LWZ1bmN0aW9uKERpc3RyaWN0Q29kZXNBLERpc3RyaWN0TmFtZUEpew0KICANCiAgIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICMgVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBkaXN0cmljIGNvZGUgZnJvbSBhbiBpbnB1dCBkYXRhZnJhbWUgdG8gZmlsdGVyIGRhdGEgY2h1bmtzIHdob3NlIGRpc3RyaWMgbmFtZSBjYW4gYmUgYWRkZWQgYnkgc2ltcGx5IHJlYWRpbmcgdGhlIGRpc3RyaWN0IGNvZGUuDQogICMgVGhlIGRhdGEgY2h1bmtzIHdpdGggZGlzdHJpY3QgbmFtZSBjb2x1bW4gYWRkZWQgYXJlIGJpbmRlZCBhbmQgcmV0dXJuZWQgYXMgYW4gb3VwdXQNCiAgIyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIA0KICBsaWJyYXJ5KCJoYXNoIikNCiAgI2RpY3Rpb25hcnkgd2l0aCAoQ09ERSA6IERJU1ROQU1FKSBwYWlyDQogIGg8LWhhc2goRGlzdHJpY3RDb2Rlc0EsRGlzdHJpY3ROYW1lQSkNCiAgDQogICN0ZW1wbGF0ZSBkYXRhZnJhbWUgZm9yIG91dHB1dA0KICBPdXREdDwtSW5wdXREdFsxLF0NCiAgT3V0RHQkRGlzdHJpY3Q8LSIiDQogIE91dER0PC1PdXREdFstMSxdDQogIA0KICBmb3IoaSBpbiBEaXN0cmljdENvZGVzQSl7DQogICANCiAgICAjc3Vic2V0IHRoZSBpbnB1dCBkYXRhIGJ5IERJU1RSLiBDT0RFDQogICAgdGVtcER0ZiA8LUlucHV0RHRbc3Vic3RyKElucHV0RHQkb3JnYW5pc2F0aW9udW5pdGNvZGUsMCwxKT09aSxdDQogICAgI2FkZCBhIERJU1RSIG5hbWUgb24gYSBuZXcgY29sdW1uICJEaXN0cmljdCIgDQogICAgdGVtcER0ZiREaXN0cmljdDwtaFtbaV1dDQogICAgDQogICAgT3V0RHQ8LXJiaW5kKE91dER0LHRlbXBEdGYpDQogICAgDQogIH0NCiAgDQogIHJldHVybihPdXREdCkNCiAgDQp9DQoNCg0KT3V0RFRGPC0gZ2V0RGlzdE5hbWVGcm9tRGlzdENvZGUoRGlzdHJpY3RDb2Rlc0EsRGlzdHJpY3ROYW1lQSkNCg0KYGBgDQoNCg==