Steven Kang
2009-Sep-08 04:39 UTC
[R] Character manipulation using "strsplit" & vectorization
Dear R users, Suppose I have a data set with inconsistent names for a field. I desire to make these to consistent names. i.e "University of New Jersey", "New Jersey Uni", "New Jersey University" (3 different inconsistent names) to "The University of New Jersey" (consistent name) Below are arbitrary data set produced from "state.name" (built in data set in R) and associated scripts. d <- as.data.frame(c(state.name[30:40], paste(state.name[30:40], "University", sep=" "), paste("Th University of", state.name[30:40], sep=" "),paste("University o", state.name[30:40], sep=" "))) da <- sapply(d, as.character) # factor to character transformation spl <- strsplit(da, " ") # spliting components dd <- character(dim(da)[1]) # initializing empty vector for (i in 1:dim(da)[1]) { if (sum(c("New", "Jersey", "University") %in% spl[[i]]) >= 3) dd[i] <- "The University of New Jersey" else if (sum(c("New", "Mexico", "University") %in% spl[[i]]) >= 3) dd[i] <- "The University of New Mexico" else if (sum(c("New", "York") %in% spl[[i]]) >2) dd[i] <- "The University of New York" else if (sum(c("North", "Carolina") %in% spl[[i]]) >2) dd[i] <- "The university of North Carolina" } Note: above shows only partial (if/else if) conditions. Q1: The above "for" loop works fine (but very slow on large data set..), thus I would like to explore whether there is an alternative VECTORIZATION method that may speed up the process. Q2: Also, is there other way to extract a string from a phrase without using "%in%"? i.e> "ac" %in% unlist(strsplit("ac dc", " "))[1] TRUE Your expertise in resolving this problem would be greatly appreciated. Steven Kang [[alternative HTML version deleted]]
David Winsemius
2009-Sep-08 12:19 UTC
[R] Character manipulation using "strsplit" & vectorization
On Sep 8, 2009, at 12:39 AM, Steven Kang wrote:> Dear R users, > > > Suppose I have a data set with inconsistent names for a field. > > I desire to make these to consistent names. > > i.e > > "University of New Jersey", "New Jersey Uni", "New Jersey > University" (3 > different inconsistent names) to "The University of New > Jersey" (consistent > name) > > Below are arbitrary data set produced from "state.name" (built in > data set > in R) and associated scripts. > > > d <- as.data.frame(c(state.name[30:40], paste(state.name[30:40], > "University", sep=" "), paste("Th University of", state.name[30:40], > sep=" > "),paste("University o", state.name[30:40], sep=" "))) > da <- sapply(d, as.character) # factor to character transformation > > spl <- strsplit(da, " ") # spliting components > > dd <- character(dim(da)[1]) # initializing empty vector > for (i in 1:dim(da)[1]) { > if (sum(c("New", "Jersey", "University") %in% spl[[i]]) >= 3) > dd[i] <- "The University of New Jersey" > else if (sum(c("New", "Mexico", "University") %in% spl[[i]]) >= 3) > dd[i] <- "The University of New Mexico" > else if (sum(c("New", "York") %in% spl[[i]]) >> 2) dd[i] <- "The University of New York" > else if (sum(c("North", "Carolina") %in% spl[[i]]) >> 2) dd[i] <- "The university of North Carolina" > } > > Note: above shows only partial (if/else if) conditions.The if (cond ){ }else{} construct is for program control rather revision of vectors. You should consider using the <- ifelse(cond ) val1 , val2) construct.> > Q1: The above "for" loop works fine (but very slow on large data > set..), > thus I would like to explore whether there is an alternative > VECTORIZATION > method that may speed up the process. > > > Q2: Also, is there other way to extract a string from a phrase > without using > "%in%"?Many grep-isch functions are available that are vectorised regular expression "machines". ? grep will show quite a few.> > i.e >> "ac" %in% unlist(strsplit("ac dc", " ")) > [1] TRUE >-- David Winsemius, MD Heritage Laboratories West Hartford, CT